【问题标题】:Must Initialize Fabric before using singleton() when calling Crashlytics.logException(ex);调用 Crashlytics.logException(ex) 时必须在使用 singleton() 之前初始化 Fabric;
【发布时间】:2020-01-20 08:32:10
【问题描述】:

我一直在努力寻找解决这个问题的方法。我已经在一个简单的应用程序中成功实现了 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。但是崩溃日志仍然没有成功。

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

周围有没有人和我一样遇到过类似的问题??如果是这样,为了使 Crashlytics 能够正常工作,您采取了哪些步骤来消除它?

编辑

这是我初始化 Fabric 的代码 sn-p,即使在 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()的代码sn-p

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.

【问题讨论】:

  • 发布代码在哪里调用 Crashlytics.logException 以及在哪里初始化 Fabric
  • @Romadro 将编辑我的问题,这是我做这两件事的代码。
  • 我想知道 renderErrorResponse 是在什么上下文中执行的?这是一项活动还是服务?什么线程?
  • 是的,它是一个活动上下文。就是这个方法只在一个活动中被调用
  • FirebaseApp initialization successful CrashlyticsInitProvider skipping initialization 。这两个信息消息显示在 logcat 的顶部

标签: android firebase crashlytics


【解决方案1】:

在你的应用中试试这个

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

【讨论】:

  • 我也试过了。但仍然没有运气。我什至尝试在应用程序清单中添加结构 API 密钥。但它仍然显示错误。这次它显示了这个错误`E/CrashlyticsCore: Crashlytics must be initialized by call Fabric.with(Context) before logging exceptions.`
【解决方案2】:

交换这行的位置:

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

到:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多