从安卓 APP 开发的角度,Java 崩溃捕获相对比较容易,虚拟机给 Java 字节码提供了一个受控的运行环境,同时也提供了完善的 Java 崩溃捕获机制。
2.1 注册
Thread中定义了Thread.UncaughtExceptionHandler
接口。
public interface UncaughtExceptionHandler {
void uncaughtException(Thread t, Throwable e);
}
Thread中存在两个UncaughtExceptionHandler字段,一个是静态的,另一个是非静态。
静态:defaultUncaughtExceptionHandler
静态方法:public static void setDefaultUncaughtExceptionHandler()
当前进程中的任何线程抛出了未捕获Exception,都会被此UncaughtExceptionHandler处理,因此管辖范围为整个进程。
非静态:uncaughtExceptionHandler
实例方法:public void setUncaughtExceptionHandler()
,即线程私有的。
为单个线程设置一个属于线程自己的uncaughtExceptionHandler,管辖范围仅限于自己的线程。
扩展:App在发生Crash的时候,是如何打印日志,如何退出的?
App启动时,Android会通过zygote进程fork一个进程,然后执行初始化工作。在初始化的过程中,会执行RuntimeInit.commonInit();
中的方法:
// /frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
protected static final void commonInit() {
if (DEBUG) Slog.d(TAG, “Entered RuntimeInit!”);
/*
- set handlers; these apply to all threads in the VM. Apps can replace
- the default handler, but not t