Leakcanary与Google的Firebase崩溃

时间:2016-06-02 07:16:03

标签: android firebase leakcanary

处理泄漏时,我的Application.onCreate内有leakcanary-android:1.4-beta2。根据我的理解,这是因为LeakCanary创建了我的应用程序类而没有所有Google Play服务,Firebase无法成功初始化。任何想法如何解决这个问题?

编辑: 我使用#include<stdio.h> int main() { int arr[5]={1,2,3,4,5},i; for(i=0;i<5;i++) { printf("%d\n",*(arr+i)); } return 0; } ,这是在转储堆后发生的。

3 个答案:

答案 0 :(得分:3)

或者,您可以按照文档的建议退出google play服务插件配置。

将FirebaseInitProvider添加到AndroidManifest.xml

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

并将其添加到您的Application类

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

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

答案 1 :(得分:0)

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

@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内,您需要数据库网址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 Services 9.0.1版编写的。

答案 2 :(得分:0)

似乎问题是由Firebase的自动初始化过程引起的。要解决此问题,您应手动禁用Firebase Init Provider和init Firebase。为此,您应该执行以下操作:

AndroidManifest文件中停用提供商:

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

通过向Application类添加此类行来手动初始化Firebase:

FirebaseApp.initializeApp(this, FirebaseOptions.fromResource(this))

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