Android RescueParty

在 Android 8.0 中,救援程序默认处于启用状态,其实现位于 /services/core/java/com/android/server/RescueParty.java 中。 在出现以下情况时,救援程序会收到有关启动和崩溃事件的信息,然后即会启动:

  • system_server 在 5 分钟内重启 5 次以上。
  • 永久性系统应用在 30 秒内崩溃 5 次以上。

当检测到上述某种情况时,救援程序会将其上报给下一救援级别、处理与该级别相关联的任务,并让设备继续运行,看看能否恢复。清除或重置内容的程度随级别而增加。最高级别会提示用户将设备恢复出厂设置。

要支持救援程序,无需特别的硬件支持。实现后,设备的恢复系统必须响应 --prompt_and_wipe_data 命令,且设备必须先提供一种方法,让用户确认用户数据是否有任何损坏,然后再继续运行。此外,恢复系统还应为用户提供有关尝试再次启动设备的选项。

由于每个救援级别都会使设备再次变为可运行状态的时间延后(可能长达 5 分钟),因此设备制造商不应添加自定义救援级别。设备处于不可运行的状态的时间越长,用户发出支持请求或保修咨询,而不是自行恢复其设备的可能性就越大。

启用条件

1. 两个系统属性的判断; 2. user版本或者 host模式的userdebug

   private static final String PROP_ENABLE_RESCUE = "persist.sys.enable_rescue";
   private static final String PROP_DISABLE_RESCUE = "persist.sys.disable_rescue"; 

   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;
    }

验证

当设备具有有效的 USB 数据连接时,系统会停止所有救援事件,因为这是一个较强的信号,表示有人正在调试设备。

要停止此类抑制行为,请运行:

adb shell setprop persist.sys.enable_rescue 1

在此处,您可以触发系统或界面崩溃循环。

要触发低级 system_server 崩溃循环,请运行:

 

adb shell setprop debug.crash_system 1

要触发中级 SystemUI 崩溃循环,请运行:

 

adb shell setprop debug.crash_sysui 1

这两个崩溃循环都会启动救援逻辑。所有的救援操作也都会记录到存储在 /data/system/uiderrors.txt 中的永久性的 PackageManager 日志中,以供日后进行检查和调试。 此外,“软件包警告消息”部分下的每个错误报告中也会包含这些永久性的日志。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinhunzw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值