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

Java Android中的Crashlytics-如何在一个地方捕获所有异常/崩溃,java,android,exception-handling,crashlytics,Java,Android,Exception Handling,Crashlytics,使用Java(android,但这是一个Java问题),我在应用程序类中创建了一个默认的异常处理程序,大致如下所示,它取自某个SO线程: public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AppInitialization(); } private void AppInitial

使用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崩溃报告记录额外信息。因此,每当发生异常时,就会调用hook uncaughtException(Thread-Thread,Throwable-ex)。我认为这将适用于崩溃和异常(不确定)

关于这一点的3个问题:

  • 这会影响crashLytics的工作方式,因为我超越了默认的异常处理程序

  • 这将允许应用程序继续-我不想这样。我只想将异常记录到其他地方,并让它继续,就好像defaultexceptionHandler不存在一样。否则,QA回归将很难看到bug,以便我们能够修复它们。如果我从uncaughtException(thread,ex)中调用defaultUEH.uncaughtException(thread,ex),它会继续循环吗

  • 哪个线程与setDefaultUncaughtExceptionHandler关联?例如,这适用于所有线程还是仅适用于主线程

  • 因此,为了清楚起见,我需要一种方法来发送关于每个crashlytics崩溃/异常的附加信息。怎么做


    更新:我看到有人找到了一个解决方案,但使用这种方法是否也会让crashlytics报告致命问题

    我找到了一种干净的方法,它测试正常。请小心使用Crashlytics.log在崩溃报告期间发送日志。在Crashlytics 2.3.14.151版本上似乎无法持续工作。我改用Crashlytics.setString(key,value)。不过,crashlytics.log似乎可以与crashlytics.logException(..)配合使用

    我的另一个问题是,它是否适用于不合理的例外情况。答案是肯定的,我自己测试过

    因此它捕获所有线程中的所有异常

    这个想法的其余部分与之类似。此人正在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. 
       }
    
    }

    现在,在安装crashlytics后的应用程序类的子类中,执行以下操作:

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

    只是想知道-你需要什么样的附加信息?我想发送崩溃的业务逻辑。例如,应用程序状态(令牌、UUID、当前选项卡)可以使问题更容易重现。我明白了,您是否考虑过使用
    Crashlytics.log
    ?通过这种方式,您可以准备要随崩溃一起发送的日志,例如应用程序中的用户行为、他打开的活动、他选择的选项卡。。。这是一个很好的想法,但我试图在应用程序的一个区域内完成这一切,而不是用Crashlytics.log调用污染应用程序。我认为将所有异常强制到一个区域并在那里工作会更干净。如果您在代码的多个点发送完全相同的数据,我可以理解这可能会造成污染,这是真的……将什么顺序从什么更改为什么@KamleshKarwande?