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方法

}

}

}