为什么Fabric没有初始化? java.lang.IllegalStateException:在使用singleton()之前必须初始化Fabric

时间:2018-06-10 08:55:32

标签: android firebase crashlytics

我根据Get started with Firebase Crashlytics为我的Android应用设置了Firebase Crashlytics(使用Android studio 3.1.3)。在我自己的设备和模拟器上,一切正常,我的崩溃在Firebase控制台中正确显示。到目前为止一切都很好。

但是,我的某个应用用户发生了意外情况:

  

java.lang.IllegalStateException:在使用singleton()

之前必须初始化Fabric

异常是在另一个Activity中抛出而不是MainActivity。

我知道您可以通过调用Fabric.with(this, new Crashlytics());手动执行here所述的初始化。但是,没有任何关于必须在上面提到的入门文章中手动初始化Crashlytics的说法。我期待这是自动完成的,因为我自己的所有测试运行良好。那么为什么对于某些用户来说,Crashlytics是正确设置的,对于某些用户来说没有?

8 个答案:

答案 0 :(得分:15)

您需要在应用程序的onCreate

中初始化Crashlytics
import android.app.Application;

import com.crashlytics.android.Crashlytics;

import io.fabric.sdk.android.Fabric;

public class TestApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Fabric.with(this, new Crashlytics());
    }
}

答案 1 :(得分:3)

就我而言,以下检查有助于消除错误。

如果您在清单中找到以下代码,请将其设置为true或将其删除,因为默认情况下为true。

   <meta-data
      android:name="firebase_crashlytics_collection_enabled"
      android:value="false" /> 

如果从您的 build.gradle 中提取了 value ,请检查其中的 buildType 并考虑不调用任何Crashlytics buildType 下的功能。

示例: build.gradle

android{

    ...

   buildTypes {
        debug{
            manifestPlaceholders = [enableCrashReporting:"false"]
        }
        release {
            manifestPlaceholders = [enableCrashReporting:"true"]
        }
   }
}

在这种情况下,您应该像这样包装您的Crashlytics调用-

if(!BuildConfig.DEBUG){
   ...
   Crashlytics.setUserIdentifier(...)
   ...
}

答案 2 :(得分:2)

使用Firebase Crashlytics时,无需进行任何Fabric初始化。一切都是自动完成的。

但是,如果您要通过(例如)Crashlytics.log("Custom log")进行任何自定义日志记录,则需要在清单中启用FirebaseCrashlytics。如果您有类似清单,请检查清单:

<meta-data
    android:name="firebase_crashlytics_collection_enabled"
    android:value="${crashlyticsEnabled}" />
可以将

${crashlyticsEnabled}设置为truefalse或通过您的应用程序级别 build.gradle 。在调试应用程序时,通常用于禁用Firebase Crashlytics。

答案 3 :(得分:1)

如果您使用android:process,则自动初始化将不起作用,因为它可以通过在清单中使用内容提供程序来实现。在这种情况下,您必须manually initialize Crashlytics

答案 4 :(得分:1)

如果您从Fabric.io迁移到Firebase,则必须从 AndroidManifest.xml

中删除某些行
        <!-- Fabric.io Analytics key -->
        <meta-data
            android:name="io.fabric.ApiKey"
            android:value="49yy995568140ee22uio128e00450bd99603fd43" />

使用这些行,Firebase无法正确初始化Crashlytics插件。

答案 5 :(得分:1)

从Fabric迁移到FirebaseCrashlytics时,出现此异常。 我没有删除

  // Remove the Fabric Crashlytics SDK.
  implementation 'com.crashlytics.sdk.android:crashlytics:2.10.1'

我没有更新代码:

Crachlytics.log(..

应该成为

FirebaseCrashlytics.getInstance().log(...

实际上只是遵循本文档中的所有内容 Upgrade to the Firebase Crashlytics SDK

答案 6 :(得分:0)

这个错误使我在Ionic 4版本上胜出。我已经安装了Cordova firebaseX模块,并且发生了此错误。

通过阅读调试日志,我设法看到firebase crashlytics集合缺少布尔值。 在androidmanifest中,我找到了这一行,只是将值更改为bool以进行热修复。我输入'true'-错误消失了。

<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="$FIREBASE_CRASHLYTICS_COLLECTION_ENABLED"/>

因此,对于任何人,在Ionic平台上都会出现此错误。在androidmanifest文件中查找上述meta行。

答案 7 :(得分:0)

对于使用NDK且存在相同问题的任何人。 在从官方文档完成此步骤之前 //添加Crashlytics NDK依赖项(如果您有 // Firebase Crashlytics依赖项,将其替换)。 使用原始依赖项对其进行初始化。