在调用Crashlytics.logException(ex)时,必须在使用singleton()之前初始化Fabric。

时间:2019-09-19 10:16:02

标签: android firebase crashlytics

我一直在努力寻找解决此问题的方法。我已经在一个简单的应用程序中成功实现了Crashlytics,例如一个包含要显示文本的简单按钮的应用程序。我什至已经在 Firebase 控制台中对其进行了测试,它使用以下行成功记录了自定义异常。

Crashlytics.logException(new IOException("A dummy IOException"));

我已经按照以下链接进行了Crashlytics的实施 Crashlytics official tutorial

仅在控制台中大约5分钟后,我就能看到在Firebase控制台中记录的非致命错误。

但是,当应用变得有些复杂时,例如当我出于某些扫描目的使用Firebase ML Vision库和其他库时,每次执行Crashlytics日志记录的代码时,它都会引发以下错误。

`java.lang.IllegalStateException: Must Initialize Fabric before using singleton()
        at io.fabric.sdk.android.Fabric.singleton(Fabric.java:301)
        at io.fabric.sdk.android.Fabric.getKit(Fabric.java:551)
        at com.crashlytics.android.Crashlytics.getInstance(Crashlytics.java:191)
        at com.crashlytics.android.Crashlytics.checkInitialized(Crashlytics.java:390)
        at com.crashlytics.android.Crashlytics.logException(Crashlytics.java:210)
        at co.behtar.behtarinternal.MainActivity$1.onClick(MainActivity.java:29)
        at android.view.View.performClick(View.java:7341)
        at android.widget.TextView.performClick(TextView.java:14226)
        at android.view.View.performClickInternal(View.java:7307)
        at android.view.View.access$3200(View.java:846)
        at android.view.View$PerformClick.run(View.java:27796)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7156)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:975)`

在此之前,我不必初始化 Fabric ,而 Crashlytics 似乎工作正常。但是在这种情况下,当我使用某些库时,即使我已经在MainActivity内部甚至在Application类内部以多种方式初始化了Fabric,它仍然会抛出此错误。

我花了整整3天的时间寻找解决方案,在整个过程中,我甚至创建了一个Fabric帐户并使用其入职页面集成了Fabric。但是使用Crash日志记录仍然没有成功。

我已按照以下链接进行Fabric实施 Fabric for Crashlytics official doc

周围的人有没有遇到像我这样的类似问题?如果是这样,您要采取什么步骤摆脱它,以使 Crashlytics 工作?

  

编辑

这是我初始化Fabric的代码段,即使Firebase Crashlytics不需要它,我也尝试过此代码。

public class App extends Application {
AppComponent appComponent;
private static Context context;

@Override
public void onCreate() {
    super.onCreate();
    Fresco.initialize(this);
    Fabric.with(this, new Crashlytics());
    if (BuildConfig.DEBUG) {
        Timber.plant(new Timber.DebugTree());
    }
    context = this;
    appComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).utilsModule(new UtilsModule()).build();
}

public static Context getContext() {
    return context;
}

public AppComponent getAppComponent() {
    return appComponent;
}

}

这是我称为Crashlytics.logException()

的代码段
private void renderErrorResponse(Throwable error) {
    if (error instanceof HttpException) {
        ResponseBody responseBody = ((HttpException) error).response().errorBody();
        LoginErrorResponse loginErrorResponse;
        try {
            String responseString = null;
            if (responseBody != null) {
                responseString = responseBody.string();
            }
            if (Utils.isValidJson(responseString)) {
                responseString = Utils.toPrettyFormat(responseString);
                loginErrorResponse = gson.fromJson(responseString, LoginErrorResponse.class);
                Utils.logMessage("LoginError", responseString);
                Utils.showCustomToast(this, loginErrorResponse.getNon_field_errors().get(0));
            }
        } catch (IOException e) {
            Utils.logError("IOException", e);
        }
    } else {
        Utils.showCustomToast(this, this.getString(R.string.something_went_wrong));
        Crashlytics.logException(error);
    }

}

编辑2:

这是在清单中添加api密钥并按照@Romadro建议更改结构初始化代码之后出现的错误。

The Crashlytics build ID is missing. This occurs when Crashlytics tooling is absent from your app's build configuration. Please review Crashlytics onboarding instructions and ensure you have a valid Crashlytics account.

2 个答案:

答案 0 :(得分:1)

在您的应用程序中尝试

      Fabric.with(
              this,
              new Crashlytics.Builder().core(
                      new CrashlyticsCore.Builder()
                              .build()
              ).build();
      );

答案 1 :(得分:0)

交换此行的位置:

Fresco.initialize(this);
Fabric.with(this, new Crashlytics());

收件人:

Fabric.with(this, new Crashlytics());
Fresco.initialize(this);