recovery 強制執行恢復出廠設置(Rescue Party)


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

 
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的官方查看此命令何意:
 
這個需要代理服務器才能查看,我把原文貼下:

 

救援程序

很多用戶嚴重依賴他們的手機,需要一台始終可以正常工作的設備。然而,有時設備會陷入重新啟動循環僵局,這樣,用戶便需要提交支持服務單據或保修咨詢。這個過程會讓用戶不舒服,而對於設備制造商和運營商來說,則需要支付高昂的費用。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM