【发布时间】: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