blob: 184b3a3b6ad6b53847c46dc43dc5b8fe4281f8cc [file] [log] [blame]
<html devsite><head>
<title>救援程序</title>
<meta name="project_path" value="/_project.yaml"/>
<meta name="book_path" value="/_book.yaml"/>
</head>
<body>
<!--
Copyright 2017 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<p>
很多用户严重依赖他们的手机,需要一台始终可以正常工作的设备。然而,有时设备会陷入重新启动循环僵局,这样,用户便需要提交支持服务单据或保修咨询。这个过程会让用户不舒服,而对于设备制造商和运营商来说,则需要支付高昂的费用。
</p>
<p>
Android 8.0 中纳入了一个功能,当该功能注意到核心系统组件陷入崩溃循环僵局时,就会派出“救援程序”。然后救援程序会通过一系列操作来上报相关情况,以期恢复设备。最后的解决方法是,救援程序使设备重新启动并进入恢复模式,然后提示用户恢复出厂设置。
</p>
<p>
<a href="/compatibility/android-cdd">Android 兼容性定义文档</a>并未要求提供此类救援功能,但此类功能对减少邮件支持记录来说非常有用。
</p>
<h2 id="implementation">实现</h2>
<p>
在 Android 8.0 中,救援程序默认处于启用状态,其实现位于 <code>/services/core/java/com/android/server/RescueParty.java</code> 中。
在出现以下情况时,救援程序会收到有关启动和崩溃事件的信息,然后即会启动:
</p>
<ul>
<li>system_server 在 5 分钟内重启 5 次以上。</li>
<li>永久性系统应用在 30 秒内崩溃 5 次以上。</li>
</ul>
<p>
当检测到上述某种情况时,救援程序会将其上报给下一救援级别、处理与该级别相关联的任务,并让设备继续运行,看看能否恢复。清除或重置内容的程度随级别而增加。最高级别会提示用户将设备恢复出厂设置。
</p>
<p>
要支持救援程序,无需特别的硬件支持。实现后,设备的恢复系统必须响应 <code>--prompt_and_wipe_data</code> 命令,且设备必须先提供一种方法,让用户确认用户数据是否有任何损坏,然后再继续运行。此外,恢复系统还应为用户提供有关尝试再次启动设备的选项。
</p>
<p>
由于每个救援级别都会使设备再次变为可运行状态的时间延后(可能长达 5 分钟),因此设备制造商不应添加自定义救援级别。设备处于不可运行的状态的时间越长,用户发出支持请求或保修咨询,而不是自行恢复其设备的可能性就越大。
</p>
<h2 id="validation">验证</h2>
<p>
当设备具有有效的 USB 数据连接时,系统会停止所有救援事件,因为这是一个较强的信号,表示有人正在调试设备。
</p>
<p>
要停止此类抑制行为,请运行:</p>
<pre class="devsite-terminal devsite-click-to-copy">adb shell setprop persist.sys.enable_rescue 1</pre>
<p>
在此处,您可以触发系统或界面崩溃循环。
</p>
<p>
要触发低级 <code>system_server</code> 崩溃循环,请运行:</p>
<pre class="devsite-terminal devsite-click-to-copy">adb shell setprop debug.crash_system 1</pre>
<p>
要触发中级 SystemUI 崩溃循环,请运行:</p>
<pre class="devsite-terminal devsite-click-to-copy">adb shell setprop debug.crash_sysui 1</pre>
<p>
这两个崩溃循环都会启动救援逻辑。所有的救援操作也都会记录到存储在 <code>/data/system/uiderrors.txt</code> 中的永久性的 PackageManager 日志中,以供日后进行检查和调试。
此外,“软件包警告消息”部分下的每个错误报告中也会包含这些永久性的日志。
</p>
</body></html>