6.7 App的Crash处理
在Android平台中,应用进程fork出来后会为虚拟机设置一个未截获异常处理器,即在程序运行时,如果有任何一个线程抛出了未被截获的异常,那么该异常最终会抛给未截获异常处理器去处理。设置未截获异常处理器的代码如下:
[—>RuntimeInit.java:commonInit]
private static final void commonInit(){
//调用完毕后,该应用中所有线程抛出的未处理异常都会由UncaughtHandler来处理
Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler());
……
}
应用程序有问题是再平常不过的事情了,不过,当抛出的异常没有被截获时,系统又会做什么处理呢?来看UncaughtHandler的代码。
6.7.1 应用进程的Crash处理
UncaughtHandler的代码如下:
[—>RuntimeInit.java:UncaughtHandler]
private static class UncaughtHandler implements
Thread.UncaughtExceptionHandler{
public void uncaughtException(Thread t, Throwable e){
try{
if(mCrashing)return;
mCrashing=true;
//调用AMS的handleApplicationCrash函数。第一个参数mApplicationObject其实
//就是前面经常见到的ApplicationThread对象
ActivityManagerNative.getDefault().handleApplicationCrash(
mApplicationObject, new ApplicationErrorReport.CrashInfo(e));
}……
finally{
//这里有一句注释很有意思:Try everything to make sure this process goes
//away.从下面这两句调用来看,该应用进程确实想方设法要离开Java世界
Process.killProcess(Process.myPid());//把自己杀死
System.exit(10);//如果上面那句话不成功,则再尝试exit方法
}
}
}