天天看點

強制執行恢複出廠設定android

前言

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

強制執行恢複出廠設定android

原因分析

我們檢視下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      
adb shell setprop debug.crash_sysui 1