我一直在努力寻找解决此问题的方法。我已经在一个简单的应用程序中成功实现了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.
答案 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);