天天看點

recovery 強制執行恢複出廠設定(Rescue Party)救援程式

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

recovery 強制執行恢複出廠設定(Rescue Party)救援程式

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