Leakcanary 在 Google 的 Firebase 中崩溃

Leakcanary crashes with Google's Firebase

处理泄漏时,我在 Application.onCreate 中得到一个 java.lang.IllegalStateException: FirebaseApp with name [DEFAULT] doesn't exist.。据我了解,发生这种情况是因为 LeakCanary 创建了我的应用程序 class 而没有所有 Google Play Services 内容,并且 Firebase 无法成功初始化。有什么解决办法吗?

编辑: 我正在使用 leakcanary-android:1.4-beta2,这发生在转储堆之后。

我相信我找到了解决方法。您可以在 Application.onCreate 或任何地方自行配置和初始化 Firebase,而不是使用 Google Play 服务插件和 google-services.json

@Provides
@Singleton
protected FirebaseApp proviceFirebaseApp(Application application) {
    FirebaseOptions options = new FirebaseOptions.Builder()
            .setApplicationId(application.getPackageName())
            .setDatabaseUrl(BuildConfig.FIREBASE_DATABASE_URL)
            .setApiKey(BuildConfig.FIREBASE_API_KEY)
            .build();
    return FirebaseApp.initializeApp(application, options);
}

找到钥匙有点神秘。在 google-services.json 中,您需要数据库 url,即 project_info.firebase_url。如果您有多个应用程序使用 Firebase 存储库,则此处将有多个 client 个对象。

如果您使用 Google 登录,oauth id 在 client[app].oauth_client[1].client_id 中。你可以根据包名找出你的clientoauth_client是第二个看起来像这样的对象:

{
  "client_id": "asfagasdgdas",
  "client_type": 3
}

api键是client[app].api_key,再根据你的包找客户端

原谅伪json.

该结构稍后可能会更改,这是为 Play 服务版本 9.0.1 编写的。

或者,您可以按照文档的建议保留 google 播放服务插件配置。

通过将此添加到 AndroidManifest.xml

来禁用 FirebaseInitProvider
<provider
    android:name="com.google.firebase.provider.FirebaseInitProvider"
    android:enabled="false" />

并将其添加到您的申请中class

FirebaseOptions options = FirebaseOptions.fromResource(this);
FirebaseApp.initializeApp(this, options);

这样您就不必手动配置 FirebaseOptions。

看来问题出在Firebase的自动初始化进程上。要解决此问题,您应该禁用 Firebase Init Provider 并手动初始化 Firebase。为此,您应该执行以下操作:

在您的 AndroidManifest 文件中禁用提供商:

<provider
android:name="com.google.firebase.provider.FirebaseInitProvider" 
android:authorities="${applicationId}.firebaseinitprovider" 
android:enabled="false" /> 

通过将这样的行添加到您的 Application class:

来手动初始化 Firebase
FirebaseApp.initializeApp(this, FirebaseOptions.fromResource(this))

P.S。 @ne'mi 的答案几乎是正确的,除了你需要添加 authorities 来禁用提供者。决定创建一个新的答案,其他人会更容易找到功能齐全的答案。