Crashlytics Android SDK – 自定义UncaughtExceptionHandler

是否可以在一个应用程序中包含自定义UncaughtExceptionHandler和crashlytics? 如果是 – 如何?

Solutions Collecting From Web of "Crashlytics Android SDK – 自定义UncaughtExceptionHandler"

由于最新版本的Crashlytics异步执行初始化,因此最好使用Fabric的初始化回调:

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() { @Override public void success(Fabric fabric) { mDefaultUEH = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(mCaughtExceptionHandler); } @Override public void failure(Exception e) { } }) .build()); 

UPDATE

请参阅@kmityak 答案,因为Crashlytics / Fabric初始化现在是异步的,我的解决方案不再有效。

原始答案

您可以设置自定义UncaughtExceptionHandler,前提是它会将exception传递给默认的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); } 

第二个选项是设置自定义UncaughtExceptionHandler 注册Crashlytics – 然后所有未捕获的exception将被Crashlytics报告为致命,然后传递给您的自定义处理程序。

对的,这是可能的。

在您的Application类中:

 @Override public void onCreate() { super.onCreate(); Crashlytics.start(this); initUncaughtExceptionHandler(); } private void initUncaughtExceptionHandler() { final ScheduledThreadPoolExecutor c = new ScheduledThreadPoolExecutor(1); c.schedule(new Runnable() { @Override public void run() { final UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread paramThread, Throwable paramThrowable) { // do my amazing stuff here System.err.println("Error!"); //then pass the job to the previous handler defaultHandler.uncaughtException(paramThread, paramThrowable); } }); } }, 5, TimeUnit.SECONDS); } 

我在5秒后安排这个的原因是因为Crashlytics需要一些时间来设置他的东西。 我正在使用此代码,它完美无缺。 当然如果您的应用程序在启动时崩溃,抱歉但没有自定义处理程序;)

没有,如果这些解决方案适合我。 我这样做如下:

 // Setup handler for uncaught exceptions. Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException (Thread thread, Throwable e) { //Send Report to Crashlytics. Crashlytics will send it as soon as it starts to work Crashlytics.logException(e); //Your custom codes to Restart the app or handle this crash HandleCrashes(thread, e); } }); 

这是我的自定义方法重启APP:

 private void HandleCrashes(Thread t, Throwable e) { Intent i = new Intent(mContext, frmLogin.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtra("JustLogin", true); startActivity(i); System.exit(1); }