导读
Android应用在开发和测试的过程中,如果出现crash,我们一般通过logcat日志信息就可以定位到crash的原因,从而排除BUG。但是如果我们的应用已经发布到了市场上,到时候再发生crash的话,我们想拿到crash的日志信息就很麻烦了,因为我们不可能去跟每一个出现crash的用户来索要crash日志。那怎么办呢?这个时候就需要我们的日志信息收集系统出手了。
最后我会把代码放的Github上面,并生成依赖包供大家使用。如果有特殊需求,也可以自己修改代码去实现。
必要性
应用的日志信息收集系统基本上是每一个应用的标配,它对用户的留存、口碑等都有很大的存在意义。但是当前的大环境导致我们开发人员很少去自己开发这个功能,原因很简单,因为有很多的第三方SDK供我们选择,而且功能齐全。但是做为一名合格的程序员,如果只是伸手而不去创造,那我们迟早也会被淘汰。
开发流程
要想实现这个功能,我们要做的工作基本上就是三个事情:
1)Crash日志的捕获
2)Crash堆栈信息的获取
3)获取到的信息上报
基本原理
本身我们的Android应用程序都是基于Java开发的,所以异常的处理也是沿用的Java异常处理机制。在Java中异常被分为两种:CheckedException 和 UnCheckedException。CheckedException是编译异常,这个一般在我们写代码的时候就已经处理了,所以在这里我们不需要过多关注。UnCheckedException是运行时异常,这个就是我们今天关注的重点。
好的,现在我们知道了要干什么,那要怎么干呢?也就是说要怎么去捕获UnCheckedException的异常呢?好在JavaAPI提供了一个全局捕获异常的处理器,Thread.UncaughtExceptionHandler接口就是我们需要的这个处理器,只要我们实现这个接口并重写其中的uncaughtException方法岂不就可以获取到我们的堆栈信息了么?
开始实现
1.首先我们new moudel ,这样以后不管在哪个项目中使用都可以。这样就很方便了,就算以后升级了,只要对这一个单独的去升级就OK了。
2.new 一个MyUnCheckedExceptionHandler类并实现Thread.UncaughtExceptionHandler接口,然后重写uncaughtException方法。然后在方法内去获取Crash的堆栈信息。
Public class MyUnCheckedExceptionHandler implements Thread.UncaughtExceptionHandler{
@Override
Public void uncaughtException(Threadt,Throwablee){
Final Writerresult = new StringWriter();
Final PrintWriterprintWriter = new PrintWriter(result);
Throwable cause=e;
while(null!=cause){
cause.printStackTrace(printWriter);
cause=cause.getCause();
}
Final StringstacktraceAsString=result.toString();
printWriter.close();
}
}
3.依赖我们的lib,然后再Application中引入。
Public class MyApplication extends Application{
@Override
publicvoidonCreate(){
super.onCreate();
addCrashSystem();
}
/*启用日志收集系统*/
privatevoidaddCrashSystem(){
Thread.setDefaultUncaughtExceptionHandler(new MyUnCheckedExceptionHandler());
}
}
至此,我们的第一步就算完成了,Crash日志已经捕获到了。但是仅仅获取堆栈信息对我们的问题定位和解决还是有点不足,