使用者非常依賴手機,隨時都需要可正常運作的裝置。不過,有時裝置會進入重新啟動迴圈,導致使用者提出支援單或保固查詢。這項程序不僅讓使用者感到沮喪,對裝置製造商和電信業者來說也相當耗費成本。
Android 8.0 (API 級別 26) 以上版本內建一項功能,可偵測核心系統元件是否陷入當機迴圈,並在偵測到時觸發救援程序。此時,救援派對功能會透過一系列動作逐步升級,以復原裝置。最後,救援派對會將裝置重新啟動至復原模式 (Recovery mode),並提示使用者恢復原廠設定。
實作
救援派對預設為啟用,實作項目位於 /services/core/java/com/android/server/RescueParty.java。如果發生下列情況,救援派對會收到開機和當機事件的資訊並啟動:
system_server在 5 分鐘內重新啟動超過 5 次。- 持續性系統應用程式在 30 秒內異常終止超過五次。
當救援派對偵測到上述情況時,就會升級至下一個救援等級,處理與該等級相關聯的工作,並讓裝置繼續運作,看看是否能恢復。每個層級都會逐步清除或重設更多內容。最後一個層級會提示使用者將裝置恢復原廠設定。
救援派對不需要特殊硬體支援。如果實作這項功能,裝置的復原系統必須回應 --prompt_and_wipe_data 指令,且裝置必須提供方法,讓使用者確認是否要銷毀使用者資料,再繼續執行作業。此外,復原系統也應提供選項,讓使用者再次嘗試啟動裝置。
由於每個救援層級最多可讓裝置在五分鐘後恢復運作,因此裝置製造商不應新增自訂救援層級。如果裝置無法運作的時間越長,使用者就越有可能發起支援或保固查詢,而不是自行修復裝置。
驗證
如果裝置有作用中的 USB 數據連線,救援派對會抑制所有救援事件,因為這強烈表示有人正在偵錯裝置。
如要覆寫這項抑制行為,請執行:
adb shell setprop persist.sys.enable_rescue 1接著,觸發系統或 UI 崩潰迴圈:
如要觸發低階
system_server異常終止迴圈,請執行下列指令:adb shell setprop debug.crash_system 1adb shell stopadb shell start如要觸發中階 SystemUI 異常終止迴圈,請執行下列指令:
adb shell setprop debug.crash_sysui 1
這兩種當機迴圈都會啟動救援邏輯。此外,Rescue Party 也會將所有救援作業記錄到 /data/system/uiderrors.txt 中儲存的永久性 PackageManager 記錄,以供日後檢查和偵錯。錯誤報告也會在「套件警告訊息」部分中,包含這些持續性記錄。