简介
作为RD最头痛的莫过于没有足够的log来分析和难以复现问题. bug日志系统是非常有必要的。不管是自己搭建还是使用三方
如何自己搭建
搭建平台肯定要考虑:获取log,上传,分析等模块,这里只介绍了Android client端如何入手。
Java提供了一个机制,用来捕获并处理在线程对象中抛出的未检测异常,以避免程序终止
通过Thread的静态内部实例UncaughtExceptionHandler来实现这种机制
Thread源码片段
private static volatile UncaughtExceptionHandler defaultUncaughtExceptionHandler;
public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
defaultUncaughtExceptionHandler = eh;
}
public static UncaughtExceptionHandler getDefaultUncaughtExceptionHandler(){
return defaultUncaughtExceptionHandler;
}
用法
- 自定义一个UncaughtExceptionHandler
- 通过Thread.setDefaultUncaughtExceptionHandler(this) 指定给所有的Thread
- 重载uncaughtException方法 dump exception 或上传,或本地分析
/**
* 这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
* thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
try {
//导出异常信息到SD卡中
dumpExceptionToSDCard(ex);
uploadExceptionToServer();
//这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug
} catch (IOException e) {
e.printStackTrace();
}
ex.printStackTrace();
//如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己
if (mDefaultCrashHandler != null) {
mDefaultCrashHandler.uncaughtException(thread, ex);
} else {
Process.killProcess(Process.myPid());
}
}
这里有Android开发艺术探索上提到的示例CrashHandler可以参看
当然自己写轮子,还要考虑合理埋点,如何抓取更详细的dump, trace等
三方资源
自己写平台统计,分析成本太高(海量数据,人力消耗蛮大的)
如果是公司有这方便的需求,但是有成本考量建议使用现有的应用崩溃检测平台
- 腾讯Bugly,开源部分功能免费
- 阿里的Testin云测试平台
- 友盟 集成测试