許多使用者都高度依賴手機,因此需要隨時有可用的裝置。不過,裝置有時會進入重新啟動循環,導致使用者提交支援單或提出保固問題。這項程序對使用者來說很麻煩,對裝置製造商和電信業者來說則成本高昂。
Android 8.0 包含一項功能,可在發現核心系統元件卡在當機迴圈時,傳送「救援隊」。Rescue Party 會透過一系列動作來升級,以便復原裝置。如最後一招,Rescue Party 會重新啟動裝置並進入復原模式,並提示使用者執行恢復原廠設定。
Android 相容性定義說明文件並未要求提供這些救援功能,但這些功能仍可用於減少支援案件。
實作
Rescue Party 在 Android 8.0 中預設為啟用,實作項目則位於 /services/core/java/com/android/server/RescueParty.java
中。Rescue Party 會接收有關啟動和當機事件的資訊,並在下列情況下啟動:
- system_server 在 5 分鐘內重新啟動超過 5 次。
- 持續性系統應用程式在 30 秒內異常終止的次數超過 5 次。
偵測到上述任一情況時,Rescue Party 會升級至下一個救援層級,處理與該層級相關聯的任務,並讓裝置繼續執行,看看是否能復原。每個層級會清除或重設的項目會越來越多。最後一關會提示使用者將裝置恢復原廠設定。
您不需要任何特殊硬體支援,即可支援 Rescue Party。如果已實作,裝置的復原系統必須回應 --prompt_and_wipe_data
指令,且裝置必須提供方式,讓使用者在繼續操作前確認是否要刪除使用者資料。復原系統也應提供使用者嘗試再次啟動裝置的選項。
由於每個搶救層級最多可延長 5 分鐘,裝置才能再次運作,因此裝置製造商不應新增自訂搶救層級。使用者使用無法運作的裝置時間越長,就越有可能啟動支援或保固服務諮詢,而不是自行復原裝置。
驗證
當裝置有有效的 USB 資料連線時,系統會抑制所有復原事件,因為這表示有人正在對裝置進行偵錯。
如要覆寫這項抑制,請執行:
adb shell setprop persist.sys.enable_rescue 1
您可以從這裡觸發系統或 UI 當機迴圈。
如要觸發低階 system_server
當機迴圈,請執行:
adb shell setprop debug.crash_system 1
如要觸發中階 SystemUI 當機迴圈,請執行:
adb shell setprop debug.crash_sysui 1
兩個當機迴圈都會啟動救援邏輯。所有復原作業也會記錄到儲存在 /data/system/uiderrors.txt
中的永久 PackageManager 記錄,以利日後檢查及偵錯。這些持續記錄也會納入每份錯誤報告的「Package warning messages」部分。