有時候我們在系統正常運行的時候,突然跑到recovery里面了,並且停在了如下界面:

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"
救援程序
很多用戶嚴重依賴他們的手機,需要一台始終可以正常工作的設備。然而,有時設備會陷入重新啟動循環僵局,這樣,用戶便需要提交支持服務單據或保修咨詢。這個過程會讓用戶不舒服,而對於設備制造商和運營商來說,則需要支付高昂的費用。
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 日志中,以供日后進行檢查和調試。 此外,“軟件包警告消息”部分下的每個錯誤報告中也會包含這些永久性的日志。