Android rescueParty 救援模式 --无法启动时,会进入recovery

rescueParty功能
rescueParty主要是为了处理当系统无法正常进入系统,当systemserver一直重启 或者 persistent app(守护应用)一直挂掉重启 时,当重启的次数达到一定次数时,rescureParty会发挥作用,rescureParty也分为不同级别,先重置简单设置,如果还是无法正常启动,再重置重要设置,如果还是无法正常启动,最后重启系统进入recovery模式,并且询问用户 是否需要擦除data分区。所有分为4个等级。

rescueParty功能的开启
rescuePart功能的代码路径为:frameworks/base/services/core/java/com/android/server/RescueParty.java

 private static boolean isDisabled() {
        // Check if we're explicitly enabled for testing
        if (SystemProperties.getBoolean(PROP_ENABLE_RESCUE, false)) {
            return false;
        }

        // We're disabled on all engineering devices
        if (Build.IS_ENG) {
            Slog.v(TAG, "Disabled because of eng build");
            return true;
        }

        // We're disabled on userdebug devices connected over USB, since that's
        // a decent signal that someone is actively trying to debug the device,
        // or that it's in a lab environment.
        if (Build.IS_USERDEBUG && isUsbActive()) {
            Slog.v(TAG, "Disabled because of active USB connection");
            return true;
        }

        // One last-ditch check
        if (SystemProperties.getBoolean(PROP_DISABLE_RESCUE, false)) {
            Slog.v(TAG, "Disabled because of manual property");
            return true;
        }

        return false;
    }

1、rescuePart功能的开启 首先要设置 “persist.sys.enable_rescue” 为 true。默认此属性是没有设置的。
2、当编译的是eng版本时,是关闭救援模式的。
3、当编译版本是userdebug,同时插上usb时,是关闭救援模式
4、当设置了 persist.sys.disable_rescue 属性为true时,会关闭救援模式

rescueParty功能的级别
rescueParty 救援模式有分5个级别,每个级别的救援方法不一样:

LEVEL_NONE
LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS
LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES
LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS
LEVEL_FACTORY_RESET

在系统启动时,当systemServer 出现异常,systemServer会重启,systemServer每重启一次,救援级别就会提升一级,每个级别有相对应的救援措施。同样当系统的PersistentApp 挂掉重启时,也是同样救援级别会提升一级。
不同级别的救援措施

不同级别的救援措施

private static void executeRescueLevelInternal(Context context, int level) throws Exception {
        switch (level) {
            case LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS:
                resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_DEFAULTS);
                break;
            case LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES:
                resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_CHANGES);
                break;
            case LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS:
                resetAllSettings(context, Settings.RESET_MODE_TRUSTED_DEFAULTS);
                break;
            case LEVEL_FACTORY_RESET:
                RecoverySystem.rebootPromptAndWipeUserData(context, TAG);
                break;
        }
    }

当LEVEL等级 提升1级到LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS时,会调用 resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_DEFAULTS) ,会把默认的不信任的Settings的配置重置。
当LEVEL等级 提升2级到LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES时,会调用 resetAllSettings(context, Settings.RESET_MODE_UNTRUSTED_CHANGES) ,会把不信任更改了的Settings的配置重置。
当LEVEL等级 提升3级到LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS时,会调用 resetAllSettings(context, Settings.RESET_MODE_TRUSTED_DEFAULTS) ,会把默认的信任的Settings的配置重置。
当LEVEL等级提升到4级到LEVEL_FACTORY_RESET时,会调用RecoverySystem.rebootPromptAndWipeUserData(context, TAG). 也就是进入Recovery模式。带promptandwipedata命令进入Recovery中,进入后有两个选项供选择,一个立即重启。另一个选项是擦除data分区。可以通过音量上下按键来进行选择。如果是因为data数据导致无法启动,擦除data分区后就可以正常启动了。

总结下,需要进行一些判断是否开启了rescueParty救援模式,如果开启之后,当systerserver或persistentApp 重启时,就是记录一下,同时提升救援等级,每个等级所执行的救援动作不同。最后会进入Recovery模式,用户可以选择擦除data分区来达到救援系统的目的。

### 提升 Android 系统救援级别的方法 在 Android 系统中,`RescueParty` 是一种专门设计用来应对系统或关键组件频繁崩溃的机制。该机制的核心目标在于逐步提升救援级别并采取更激进的操作以恢复设备正常运行状态[^1]。 #### 1. **触发条件** 当 `SystemServer` 或持久化应用(Persistent Apps)发生多次连续崩溃时,系统会自动检测这些异常行为,并决定是否需要进入更高的救援级别。每次崩溃都会被记录下来,同时系统内部维护了一个计数器来跟踪失败次数。一旦超过预设阈值,则会升级至下一救援阶段[^2]。 #### 2. **救援等级划分及其操作** - **Level 0**: 初始状态下不执行任何特殊措施;仅简单尝试重新启动受影响的服务。 - **Level 1**: 如果再次遇到相同错误,在此层面上可能会延迟服务重启时间间隔以便观察是否有其他潜在问题浮现出来。 - **Higher Levels (e.g., Level 2, etc.)**: 随着救援级别的升高,后续行动可能涉及清除缓存数据、禁用某些第三方应用程序或者强制关闭特定进程等功能模块直至最终达到最高级即引导用户进入 Recovery Mode 下手动干预比如擦除 Data 分区等极端手段恢复正常工作环境为止. #### 3. **实现逻辑分析** 以下是关于如何编程层面控制 Rescue Party 的伪代码表示: ```java public class RescueManager { private int crashCount; public void handleCrash() { this.crashCount++; switch(getCurrentRescueLevel()) { case RESCUE_LEVEL_0: restartService(); // 尝试直接重啟服務 break; case RESCUE_LEVEL_1: delayRestartAndMonitor(); // 增加延遲並監控 break; default: escalateToNextLevel(); if(isMaxLevelReached()){ enterRecoveryMode(); // 进入恢復模式 } break; } } private int getCurrentRescueLevel(){ // 根據崩潰次數或其他條件計算當前級別 return calculateBasedOn(crashCount); } } ``` 上述代码展示了基于不同救援级别的响应策略以及何时应该推进到下一个更高层次的过程。 #### 4. **注意事项** 开发者需要注意的是,虽然提高救援级别可以帮助解决当前存在的严重问题,但它也可能带来副作用,例如删除用户的个人资料或暂时失去部分功能访问权限等问题。因此,在实际部署之前应当充分测试各种场景下的表现情况,确保不会对用户体验造成负面影响的同时有效解决问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值