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
中。你可以根据包名找出你的client
,oauth_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
来禁用提供者。决定创建一个新的答案,其他人会更容易找到功能齐全的答案。
处理泄漏时,我在 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
中。你可以根据包名找出你的client
,oauth_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:
FirebaseApp.initializeApp(this, FirebaseOptions.fromResource(this))
P.S。 @ne'mi 的答案几乎是正确的,除了你需要添加 authorities
来禁用提供者。决定创建一个新的答案,其他人会更容易找到功能齐全的答案。