Crashlytics Android SDK - 自定义UncaughtExceptionHandler

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报告为致命,然后传递给您的自定义处理程序.

  • 我没有得到方法`Crashlytics.start(this)`.我正在使用`crashlytics:2.5.1`.我只是想退出我的应用程序以及向Fabric发送报告.我怎么能这样做? (3认同)

小智 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)

  • 我在我的Application类中尝试了这个,在我的情况下,失败(Exception e)收到一个异常的回调:"com.crashlytics.sdk.android.crashlytics-core Initialization was canceled".任何想法,为什么会发生这种情况? (3认同)
  • 从我在 CrashlyticsCore (v2.9.4) 中看到的内容来看,在 onPreExecute() 中调用了 CrashlyticsController.enableExceptionHandling()。所以这仍然在同一个线程中完成。此外,CrashlyticsUncaughtExceptionHandler(控制器使用)确保将异常传递给任何存在的默认处理程序。因此,只要您执行相同的操作,初始化 Fabric 和您自己的异常处理程序的顺序就无关紧要。 (2认同)
  • 我正在尝试此操作,但是没有调用InitializationCallback。有任何想法吗? (2认同)