Android中的Crashlytics - 如何在一个地方捕获所有异常/崩溃

时间:2017-02-15 22:00:46

标签: java android exception-handling crashlytics

使用Java(android但这是一个java问题)我已经在应用程序类中创建了一个默认的异常处理程序,这个或多或少是从某个SO线程中获取的:

    public class MyApplication extends Application {
@Override
    public void onCreate() {
        super.onCreate();
        AppInitialization();
    }

    private void AppInitialization() {
         defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
         Thread.setDefaultUncaughtExceptionHandler(_unCaughtExceptionHandler);
    }

    private UncaughtExceptionHandler defaultUEH;

    // handler listener
    private Thread.UncaughtExceptionHandler _unCaughtExceptionHandler = new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            ex.printStackTrace();
            // TODO handle exception here
        }
    };
}

让我们谈谈我的目标是什么。我需要记录crashLytics崩溃报告的额外信息。因此,只要发生异常,就会调用钩子uncaughtException(Thread thread,Throwable ex)。我认为这将适用于崩溃和异常(不确定)。

3个问题:

  1. 这会影响crashLytics的工作方式,因为我会覆盖默认的异常处理程序。

  2. 这会让应用继续 - 我不想要这个。我只想在其他地方记录异常并让它继续,好像defaultexceptionHandler不存在一样。否则,QA回归将很难看到错误,因此我们可以修复它们。如果我从uncaughtException(thread,ex)中调用defaultUEH.uncaughtException(thread,ex)它会继续循环吗?

  3. 什么线程与setDefaultUncaughtExceptionHandler相关联?这适用于所有线程,例如主线程吗?

  4. 所以要明确一点,我需要一种方法来发送每个崩溃崩溃/异常的附加信息。怎么样?

    更新:我看到here有人发现了一个解决方案,但是使用这种方法会让崩解剂报告致命问题吗?

1 个答案:

答案 0 :(得分:1)

我找到了一种干净利落的方法,它可以测试。小心Crashlytics.log在崩溃报告期间发送日志。似乎在版本Crashlytics 2.3.14.151上不能始终如一。我改用Crashlytics.setString(key,value)。 crashlytics.log似乎与crashlytics.logException(..)一起正常工作。

我遇到的另一个问题是它是否适用于不正常的例外。答案是肯定的,我自己测试过。

所以它捕获了所有线程的所有异常。

其余的想法与here类似。此人在defaultExceptionHandler上使用装饰器模式向uncaughtException方法添加功能。

这就是我如何增强它:

   public class DefaultUnCaughtExceptionHandlerDecorator implements UncaughtExceptionHandler {

   private UncaughtExceptionHandler mDefaultUncaughtExceptionHandler; //we will decorate the default handler to add functionality to it

   public DefaultUnCaughtExceptionHandlerDecorator(UncaughtExceptionHandler mDefaultUncaughtExceptionHandler) {
       this.mDefaultUncaughtExceptionHandler = mDefaultUncaughtExceptionHandler;
   }

   @Override
   public void uncaughtException(Thread t, Throwable e) {

       logToCrashLytics(); //add our crashlytics logging and keys here
       //  we have added our crashlytics extra data, now invoke Crashlytics
       mDefaultUncaughtExceptionHandler.uncaughtException(t, e);
   }

   private void logToCrashLytics() {

           Crashlytics.setUserIdentifier(Model.getUserID());//or whatever. this will show directly on crashlytics dashboard a pretty element

       Crashlytics.setString("Some useful Info","user is logged in"); // or whatever you want, such as printing out singleton managers references or model info
     //dont use Crashlytics.Log(..) here. it wont work consistent. 
   }

}

现在在Application类的子类中安装了crashlytics,执行以下操作:

Thread.setDefaultUncaughtExceptionHandler(new DefaultUnCaughtExceptionHandlerDecorator(Thread.getDefaultUncaughtExceptionHandler()));