Android性能优化之UncaughtExceptionHandler定制自己的错误日志系统

前言:

每当我们app测试的时候,测试人员总是对我们说这里崩溃了,那里挂掉了!我们只能默默接受,然后尝试着重现bug,更可悲的是有时候bug很难复现,为了解决这种现状所以我们要尝试这建立一个自己的bug日志系统。

实现原理:

Java为我们提供了一个机制,用来捕获并处理在一个线程对象中抛出的未检测异常,以避免程序终止。我们可以通过UncaughtExceptionHandler来实现这种机制。

具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public class CrashHandler implements UncaughtExceptionHandler {
public static final String TAG = "CrashHandler";
// CrashHandler
private static CrashHandler instance;
// 程序的Context对象
private Application application;
// 系统默认的UncaughtException处理类
private UncaughtExceptionHandler mDefaultHandler;
/**
* 保证只有一个CrashHandler实例
*/
private CrashHandler(Context context) {
application = (Application) context.getApplicationContext();
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
/**
* 获取CrashHandler实例 ,单例模式
*/
public static CrashHandler getInstance(Context context) {
CrashHandler inst = instance;
if (inst == null) {
synchronized (CrashHandler.class) {
inst = instance;
if (inst == null) {
inst = new CrashHandler(context.getApplicationContext());
instance = inst;
}
}
}
return inst;
}
/**
* 这个是关键函数,当程序中有未捕获的异常,系统会自动调用 uncaughtException 方法
* thread 为出现未捕获异常的线程,ex 为未捕获的异常,有了这个 ex,我们就可以得到异常信息
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
try{
// 导出异常信息到 SD 卡中
dumpExceptionToSDCard(ex);
// 这里可以上传异常信息到服务器,便于开发人员分析日志从而解决问题
uploadExceptionToServer();
}catch (IOException e){
e.printStackTrace();
}
ex.printStackTrace();
// 如果系统提供了默认的异常处理器,则交个系统去结束程序,否则就由自己结束自己
if(mDefaultHandler !=null){
mDefaultHandler.uncaughtExcepted(thread,ex);
}else{
Process.killProcess(Process.myPid());
}
}
}
}
}

初始化:

1
2
3
4
5
6
7
8
9
public class MyApplication extends MultiDexApplication {
@Override
public void onCreate() {
super.onCreate();
//初始化 错误日子系统
CrashHandler crashHandler = CrashHandler.getInstance(this);
}
}

[参考文献]