Java Android中的Crashlytics-如何在一个地方捕获所有异常/崩溃
使用Java(android,但这是一个Java问题),我在应用程序类中创建了一个默认的异常处理程序,大致如下所示,它取自某个SO线程: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
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报告致命问题 我找到了一种干净的方法,它测试正常。请小心使用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?