许多用户非常依赖他们的手机,并且需要设备始终正常工作。但是,有时设备最终会进入重启循环,这会导致用户提交支持请求或保修咨询。此过程对用户来说令人沮丧,并且对于设备制造商和运营商来说成本高昂。
Android 8.0 包含一项功能,当它注意到核心系统组件卡在崩溃循环中时,会发出“救援派对”。然后,Rescue Party 会逐步升级一系列操作以恢复设备。作为最后的手段,Rescue Party 会将设备重启到恢复模式,并提示用户执行恢复出厂设置。
这些救援功能不是 Android 兼容性定义文档 所要求的,但可能仍有助于减少支持案例。
实现
Rescue Party 在 Android 8.0 中默认启用,其实施位于 /services/core/java/com/android/server/RescueParty.java
中。Rescue Party 接收有关启动和崩溃事件的信息,并在以下情况下启动:
- system_server 在 5 分钟内重启超过 5 次。
- 持久系统应用在 30 秒内崩溃超过 5 次。
当检测到其中一种情况时,Rescue Party 会升级到下一个救援级别,处理与该级别关联的任务,并让设备继续运行,以查看是否可以恢复。每个级别的清除或重置操作都越来越激进。最后一个级别会提示用户恢复出厂设置设备。
无需特殊的硬件支持即可支持 Rescue Party。如果实施,设备的恢复系统必须响应 --prompt_and_wipe_data
命令,并且设备必须提供一种方式,供用户在继续操作之前确认对用户数据的任何破坏。恢复系统还应让用户选择再次尝试启动其设备。
由于每个救援级别最多可能需要 5 分钟才能使设备再次可操作,因此设备制造商不应添加自定义救援级别。设备无法操作的时间增加,使用户更有可能发起支持或保修咨询,而不是自行恢复设备。
验证
当设备具有活动的 USB 数据连接时,所有救援事件都会被抑制,因为这是一个强烈信号,表明有人正在调试设备。
要覆盖此抑制,请运行
adb shell setprop persist.sys.enable_rescue 1
从那里,您可以触发系统或 UI 崩溃循环。
要触发低级别 system_server
崩溃循环,请运行
adb shell setprop debug.crash_system 1
要触发中级别 SystemUI 崩溃循环,请运行
adb shell setprop debug.crash_sysui 1
这两个崩溃循环都会启动救援逻辑。所有救援操作也会记录到存储在 /data/system/uiderrors.txt
的持久性 PackageManager 日志中,以供以后检查和调试。这些持久性日志也包含在每个错误报告的“软件包警告消息”部分下。