众所周知,当 Andoird 程序发生未捕获的异常的时候,程序会直接 Crash 退出。而所谓安全气囊,是指在 Crash 发生时捕获异常,然后触发兜底逻辑,在程序退出前做最后的抢救。
一,Java捕获异常
在实现安全气囊之前,我们先思考一个问题,像 bugly、sentry 这种监控框架是如何捕获异常并上传堆栈的呢?要了解这个问题,我们首先要了解一下当异常发生时是怎么传播的。
可以看到,异常到奔溃的流程很简单,主要分为以下几步:
- 当抛出异常时,通过Thread.dispatchUncaughtException进行分发。
- 依次由Thread,ThreadGroup,Thread.getDefaultUncaughtExceptionHandler处理。
- 在默认情况下,KillApplicationHandler会被设置defaultUncaughtExceptionHandler。
- 然后KillApplicationHandler中会调用Process.killProcess退出应用。
可以看出,如果我们通过Thread.setDefaultUncaughtExceptionHandler设置自定义处理器,就可以捕获异常做一些兜底操作了,其实 bugly 这些库也是这么做的。
二、自定义异常处理器
那么如果我们设置了自定义处理器