Android Firebase and Appmetrica conflict



我正在使用Firebase Realtime Database和Yandex Analytics (AppMetrica(。当我尝试同时使用此SDK时,Firebase数据库中出现错误:

05-14 16:01:47.797 8194-8229/com.backgrounds.test:Metrica E/SQLiteLog: (5) database is locked
05-14 16:01:47.810 8194-8229/com.backgrounds.test:Metrica E/SQLiteDatabase: Failed to open database '/data/user/0/com.backgrounds.test/databases/backgrounds-74bc1.firebaseio.com_default'.
android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
at android.database.sqlite.SQLiteConnection.executeForString(SQLiteConnection.java:635)
at android.database.sqlite.SQLiteConnection.setJournalMode(SQLiteConnection.java:321)
at android.database.sqlite.SQLiteConnection.setWalModeFromConfiguration(SQLiteConnection.java:295)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:216)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:194)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:493)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:200)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:192)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:864)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:849)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:724)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:714)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:295)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:238)
at com.google.android.gms.internal.firebase_database.zzu.zza(Unknown Source:5)
at com.google.android.gms.internal.firebase_database.zzu.<init>(Unknown Source:21)
at com.google.android.gms.internal.firebase_database.zzq.zza(Unknown Source:99)
at com.google.android.gms.internal.firebase_database.zzbz.zzq(Unknown Source:6)
at com.google.android.gms.internal.firebase_database.zzck.zzca(Unknown Source:48)
at com.google.android.gms.internal.firebase_database.zzck.zza(Unknown Source:0)
at com.google.android.gms.internal.firebase_database.zzcl.run(Unknown Source:2)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

我的应用程序实际上不会崩溃,因为此错误位于运行AppMetrica的进程内,但是我不断看到"应用程序已停止"窗口。

没有初始化AppMetrica,一切正常,我根本没有收到任何错误。我只知道AppMetrica使用单独的进程来运行。 谁能解释我如何解决这个问题?

官方文档:

AppMetrica 库的工作原理 AppMetrica 库由两部分组成:客户端和服务。 客户端部分预先验证数据并将其传输到服务部分,服务部分负责存储数据并将其发送到服务器。 该服务在单独的进程中运行。这样做的原因是,库对应用程序的性能和内存影响最小。此外,它将库从对应用程序稳定性的依赖中解放出来,因此即使应用程序崩溃或不稳定,它也可以存储和交付数据。但是,这引入了使用 AppMetrica 的某些细节。 如果应用本身有多个进程,则必须使用相同的配置以相同的方式执行 AppMetrica 初始化。否则,您可能会遇到以下情况:AppMetrica 库的配置取决于首先初始化哪个进程(因为每个进程都有自己的 AppMetrica 客户端部件实例,而有一个共享服务部件(。 我们建议在 Application.onCreate(( 方法中初始化 AppMetrica 库(这样库在每个进程中完成 Application.onCreate(( 方法调用(。但是,您应该考虑 ContentProvider 的生命周期。不能保证在创建内容提供程序实例之前将创建应用程序实例。另请记住,Application.onCreate(( 方法中的代码也为服务进程运行。 因此,如果您不希望某些代码多次执行,请不要将其放在 Application.onCreate(( 方法中。最好在创建其他组件时运行此代码,或者将其放在单独的服务中。您还应该避免在 Application.onCreate(( 方法中执行冗长的操作。

看来你应该避免从AppMetrica进程访问Firebase。如果无法提供帮助,请提供有关 Firebase 使用情况的更多信息。

根据 appmetrica 安装和初始化,appmetrica SDK 创建一个名为 PACKAGENAME:Metrica 的进程

对于具有多个进程的应用程序,Application.onCreate(( 方法中的代码适用于所有进程。如果您在集成第三方库(例如 Firebase Cloud Messaging、realm、appcenter ...(后遇到初始化错误,请确保仅在主进程中初始化第三方库。所以你可以这样做:

class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (!isMainProcess()) {
return;
}
// Initializing third-party libraries after verification.
}
}

isMainProcess 是:

private boolean isMainProcess() {
return getPackageName().equals(getMyProcessName());
}

最新更新