1 前言
在日常使用中我们总会记录一些异常信息,例如崩溃信息等,这些功能可以借助第三方工具实现,例如友盟,oneAPM 等,但是有时这些工具满足不了我们的需求,或者说不是那么友好,这时,我们就需要自己做一个异常信息收集工具了。
2 Crash框架的功能
在日常使用中我们总会记录一些异常信息,例如崩溃信息等,这里我们就可以实现以下的崩溃框架。
功能:
1记录崩溃时的异常信息,包括崩溃时的异常栈信息
2 将崩溃时的异常信息记录到文件中,约定好格式
3 将异常日志上传到服务器平台
4 异常信息可以写入到单独的异常信息文件(往往异常信息较少,最好不要与日志混在一起)
3 Crash框架的设计与实现
这个框架较为简单,UML图如下:
可以看到就是实现了Thread.UncaughtExceptionHandler接口,代码如下:
/**
* @author Created by qiyei2015 on 2017/5/7.
* @version: 1.0
* @email: 1273482124@qq.com
* @description: 崩溃时异常处理器
*/
public class ExceptionCrashHandler implements Thread.UncaughtExceptionHandler {
/**
* 调试标志
*/
private final static String TAG = ExceptionCrashHandler.class.getSimpleName();
/**
* 默认的线程ExceptionHandler
*/
private Thread.UncaughtExceptionHandler mDefaultHandler;
private static class SingleHolder{
private final static ExceptionCrashHandler sHandler = new ExceptionCrashHandler();
}
/**
* 构造方法私有化
*/
private ExceptionCrashHandler(){
}
/**
* 内部类的方式提供单例
* @return
*/
public static ExceptionCrashHandler getInstance(){
return SingleHolder.sHandler;
}
/**
* 初始化,一般在Application中调用
*/
public void init(){
//设置全局的异常处理类为本类
Thread.currentThread().setUncaughtExceptionHandler(this);
//获取当前线程默认的ExceptionHandler
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
}
@Override
public void uncaughtException(Thread t, Throwable e) {
LogManager.e(TAG,e.getMessage());
//写入到本地文件 e 当前应用版本 手机信息
// 1. 崩溃的详细信息
// 2. 应用信息 包名 版本号
// 3. 手机信息 系统版本 手机型号 内存
// 4. 保存当乞丐了文件,等应用再次启动再上传(上传文件不在这里处理)
String crashFile = LogManager.writeExceptionToFile(e);
LogManager.e(TAG,"crashFile --> " + crashFile);
// 缓存崩溃日志文件
LogManager.cacheCrashFile(crashFile);
uploadCrashLog();
//让系统默认处理器处理
mDefaultHandler.uncaughtException(t,e);
}
/**
* 上传crash日志到服务器
*/
private void uploadCrashLog(){
//自己实现
}
}
代码很简单,我就不讲解了。