有时候我们在系统正常运行的时候,突然跑到recovery里面了,并且停在了如下界面:


recovery 强制执行恢复出厂设置(Rescue Party)_第1张图片 Can't load Android system. Your data may be corrupt. If you continue to get this message, you may need to perform a factory data reset and erase all user data stored on this device.

意思是说,不能加载正常的安卓系统,可能数据损坏,如果你继续收到此消息,请执行恢复出厂设置擦除所有的用户数据
我们查看下recovery的log:
cat /tmp/recovery.log[    1.516818]           erasing_text: en (68 x 29 @ 990)[    1.520345]        no_command_text: en (124 x 29 @ 990)[    1.523416]             error_text: en (49 x 29 @ 990)[    1.993076]        installing_text: en (228 x 29 @ 990)[    2.028634] SELinux: Loaded file_contexts[    2.028675] Command: "/sbin/recovery" "--prompt_and_wipe_data" "--reason=RescueParty" "--locale=en_US"

有参数“ --prompt_and_wipe_data”,我们可以在google的官方查看此命令何意:


https://source.android.com/devices/tech/debug/rescue-party
这个需要代理服务器才能查看,我把原文贴下:

救援程序

很多用户严重依赖他们的手机,需要一台始终可以正常工作的设备。然而,有时设备会陷入重新启动循环僵局,这样,用户便需要提交支持服务单据或保修咨询。这个过程会让用户不舒服,而对于设备制造商和运营商来说,则需要支付高昂的费用。

Android 8.0 中纳入了一个功能,当该功能注意到核心系统组件陷入崩溃循环僵局时,就会派出“救援程序”。然后救援程序会通过一系列操作来上报相关情况,以期恢复设备。最后的解决方法是,救援程序使设备重新启动并进入恢复模式,然后提示用户恢复出厂设置。

Android 兼容性定义文档并未要求提供此类救援功能,但此类功能对减少邮件支持记录来说非常有用。

实现

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

system_server 在 5 分钟内重启 5 次以上

永久性系统应用在 30 秒内崩溃 5 次以上。

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

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

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

验证

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

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

adb shell setprop persist.sys.enable_rescue 1

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

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

adb shell setprop debug.crash_system 1

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

adb shell setprop debug.crash_sysui 1

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

原来这个是android加的自动判断系统状态,实现的救援程序,触发进入recovery,强制执行恢复出厂设置。
主要的代码路径: frameworks/base/services/core/java/com/android/server/RescueParty.java
有时候我们在断电煲机的时候,有时候会触发系统的救援程序,其实是在压力测试,但是触发了android本身的救援程序,我们可以把 救援程序禁止,这样防止煲机触发进入recovery系统。执行如下命令即可: setprop persist.sys.disable_rescue true

更多相关文章

  1. PHP如何检测手机是什么系统?
  2. 调用android系统自带的功能
  3. 整理文:Android设备唯一码
  4. android中获取设备的型号、手机厂商以及手机唯一标识符IMEI
  5. Android 监听系统虚拟导航栏按键
  6. android 记录所有打开的Activity,退出程序

随机推荐

  1. android notification和notificationmana
  2. android file 记录
  3. android(7)(写数据权限)
  4. Android通过内容提供器获取相册中所有图
  5. 安卓中颜色种类
  6. Android studio 获取MD5和SHA1值
  7. android关于网络
  8. android 视频播放器
  9. Android 自定义View之能力分析图
  10. android中自定义的一个可以弹出类似于提