Android O中增加了一个新的功能,当核心系统组件发生循环崩溃的时候,就会触发“救援程序”,也就是本篇要介绍的RescueParty 。然后RescueParty 会通过自身判断逻辑来进行崩溃级别的提升,直到最后触发ResetFactory,进而进入Recovery,然后提示用户恢复出厂设置。
接下来根据源码(基于Android Q)来分析下是如何触发救援程序以及进入Recovery。
涉及到的源码路径:
frameworks/base/services/core/java/com/android/server/RescueParty.java
frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
frameworks/base/services/core/java/com/android/server/am/AppErrors.java
通过RescueParty类的概述可以了解到,程序崩溃的足够频繁,并且逐步上升级别,最终通过提示用户擦除数据解决。救援级别分为5级,只有达到LEVEL_FACTORY_RESET这个级别,才会触发设备进入Recovery。而通过"sys.rescue_level"这个属性可以查询当前处于什么级别?
/**
* Utilities to help rescue the system from crash loops. Callers are expected to
* report boot events and persistent app crashes, and if they happen frequently
* enough this class will slowly escalate through several rescue operations
* before finally rebooting and prompting the user if they want to wipe data as
* a last resort.
*/
//救援级别
static final int LEVEL_NONE = 0;
static final int LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS = 1;
static final int LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES = 2;
static final int LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS = 3;
static final int LEVEL_FACTORY_RESET = 4;
接着来看下如何触发级别上升,并最终达到LEVEL_FACTORY_RESET。RescueParty 类中