jsk*_*rbi 26 android crashlytics
是否可以在一个应用程序中包含自定义UncaughtExceptionHandler和crashlytics?如果是 - 如何?
jsk*_*rbi 34
UPDATE
请参阅@kmityak 答案,因为Crashlytics/Fabric初始化现在是异步的,我的解决方案不再有效.
原始答案
您可以设置自定义UncaughtExceptionHandler,前提是它会将异常传递给默认的UncaughtExceptionHandler,以便稍后通过Crashlytics进行处理.
下面的代码在Application子类中实现:
private static Thread.UncaughtExceptionHandler mDefaultUEH;
private static Thread.UncaughtExceptionHandler mCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// Custom logic goes here
// This will make Crashlytics do its job
mDefaultUEH.uncaughtException(thread, ex);
}
};
@Override
public void onCreate() {
super.onCreate();
// Order is important!
// First, start Crashlytics
Crashlytics.start(this);
// Second, set custom UncaughtExceptionHandler
mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
Run Code Online (Sandbox Code Playgroud)
第二个选项是在设置自定义UncaughtExceptionHandler 后注册Crashlytics - 然后所有未捕获的异常将被Crashlytics报告为致命,然后传递给您的自定义处理程序.
小智 15
由于最新版本的Crashlytics异步执行初始化,因此最好使用Fabric的初始化回调:
private static Thread.UncaughtExceptionHandler mDefaultUEH;
private static Thread.UncaughtExceptionHandler mCaughtExceptionHandler =
new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread thread, Throwable ex) {
// Custom logic goes here
// This will make Crashlytics do its job
mDefaultUEH.uncaughtException(thread, ex);
}
};
CrashlyticsCore core = new CrashlyticsCore.Builder()
.disabled(BuildConfig.DEBUG)
.build();
Fabric.with(new Fabric.Builder(this).kits(new Crashlytics.Builder()
.core(core)
.build())
.initializationCallback(new InitializationCallback<Fabric>() {
@Override
public void success(Fabric fabric) {
mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler);
}
@Override
public void failure(Exception e) {
}
})
.build());
Run Code Online (Sandbox Code Playgroud)