軟式重新啟動

Android 11 支援軟體重新啟動, 使用者空間內程序重新啟動時,用於套用 需要重新啟動 (例如更新 APEX 套件)。目前調低音量 只有掛接 userdata 後啟動的程序才會重新啟動。

請按照以下方式要求軟重新啟動:

  • 通話來源:PowerManager PowerManager.reboot(PowerManager.REBOOT_USERSPACE)

  • 從殼層使用 adb shell svc power reboot userspaceadb reboot userspace

軟重新啟動後,憑證加密儲存空間會保持解鎖狀態。

如果裝置支援軟重新啟動, PowerManager.isRebootingUserspace() API 方法會傳回 true,而值 系統屬性 init.userspace_reboot.is_supported 等於 1

如果裝置不支援軟重新啟動,請呼叫 PowerManager.reboot(PowerManager.REBOOT_USERSPACE)adb reboot userspaceadb shell svc power reboot userspace 失敗。

軟體式重新啟動執行

要求軟重新啟動後 (透過 PowerManager 或殼層) init 會執行下列步驟:

  1. 會收到 sys.powerctl=reboot,userspace

  2. 建立個別分支 UserspaceRebootWatchdogThread() 程序,以監控軟體重新啟動

  3. 觸發 userspace-reboot-requested 動作,會重設所有系統 屬性。受影響的資源:

    • sys.usb.config
    • sys.usb.state
    • sys.boot_completed
    • dev.bootcomplete
    • sys.init.updatable_crashing
    • sys.init.updatable_crashing_process_name
    • apexd.status
    • sys.user.0.ce_available
    • sys.shutdown.requested
    • service.bootanim.exit

    上述屬性應在啟動序列期間再次設定。如有需要: 重設其他屬性。相關範例請參閱 on userspace-reboot-requestedrootdir/init.rc

  4. 執行 DoUserspaceReboot 函式,用於執行下列動作:

    1. SIGTERM 傳送至掛接 userdata 之後啟動的處理程序, 等待系統停止執行
    2. 達到逾時時間後,傳送 SIGKILL 終止任何執行中的作業 作業。
    3. 呼叫 /system/bin/vdc volume reset
    4. 卸載 zRAM 備用裝置。
    5. 卸載使用中的 APEX 套件。
    6. 切換回啟動掛接掛接命名空間。
    7. 觸發 userspace-reboot-resume 動作。

如果要求在軟重新啟動前要求檔案系統查核點, userdata 會在以下期間重新掛接為檢查點模式: userspace-reboot-fs-remount 動作 (詳情請參閱下節)。A 罩杯 設定 sys.boot_completed property 後,系統會視為軟重新啟動 至 1。軟重新啟動結束時,螢幕會保持關閉狀態, 需要明確的使用者互動才能喚醒。

檔案系統查核點

如果在軟重新啟動前要求了檔案系統查核點, userdata 會在虛重新啟動期間以檢查點模式重新掛接。 重新掛接邏輯的 fs_mgr_remount_userdata_into_checkpointing 產生的函式,且檢查點方法間的差異。具體來說 「userdata」支援:

  • 檔案系統層級查核點 (例如 f2fs),userdata 是 透過 checkpoint=disable 選項重新掛接。

  • 區塊層級查核點 (例如 ext4):先卸載 /data 以及掛接該元件的所有父項裝置對應工具裝置 已刪除。接著,系統會使用與以下項目相同的程式碼路徑掛接 userdata 一般查核點啟動程序

使用檔案系統層級的金鑰環來管理憑證加密 (CE) 和 裝置加密 (DE) 金鑰,在 userdata 卸載後金鑰就會遺失。目的地: 允許還原金鑰 (將金鑰安裝到檔案系統金鑰環時,vold) 也會將同一個 fscrypt-provisioning 類型的金鑰安裝在工作階段層級 金鑰環。呼叫 init_user0 時,vold 會在檔案中重新安裝金鑰。 系統鑰匙圈

返回強制重新啟動

如要確保裝置自動重新啟動不會讓裝置處於無法使用的狀態, Android 11 提供了備用強制重新啟動機制, 會在符合下列其中一項條件時觸發:

  • 裝置無法啟動軟重新啟動 (即 sys.init.userspace_reboot.in_progress=1)。
  • 程序無法在指定的逾時時間內停止。
  • /system/bin/vdc volume reset 作業失敗。
  • zRAM 裝置的卸載失敗。
  • 未正確卸載使用中的 APEX 套件。
  • 無法將 userdata 重新掛接至查核點模式。
  • 裝置無法在以下時間內成功啟動 (也就是 sys.boot_completed=1) 逾時。

依裝置設定區分

變更下列項目的值,即可調整部分非重新啟動切面 資源:

  • init.userspace_reboot.is_supported 可控管裝置何時可執行 軟重新啟動。如果此屬性值為 false0 或未指定, 則會拒絕嘗試重新啟動
  • init.userspace_reboot.sigkill.timeoutmillis 控制逾時時間: 則在處理後接收SIGKILL訊號停止。如果其中之一 程序無法於指定的逾時時間停止, 在這種情況下,裝置必須重新開機。
  • init.userspace_reboot.sigterm.timeoutmillis 控制逾時時間: 也就是在收到 SIGTERM 訊號停止時等待的時間。所有語言 如果程序在指定逾時內無法終止,就會收到 SIGKILL信號。
  • init.userspace_reboot.started.timeoutmillis 控制逾時時間: 幾毫秒才啟動 sys.init.userspace_reboot.in_progress=1)。如果裝置無法啟動軟式啟動程序 且重新啟動時,就會觸發強制重新啟動的備用機制。
  • init.userspace_reboot.userdata_remount.timeoutmillis 控制逾時時間: 待卸載 userdata 的毫秒數。如果裝置無法卸載 userdata 逾時,也會觸發強制重新啟動。
  • init.userspace_reboot.watchdog.timeoutmillis 可控制 才能順利啟動裝置 (即 sys.boot_completed=1)。如果裝置 無法在指定的逾時時間內啟動,但強制重新啟動的備用機制是
,瞭解如何調查及移除這項存取權。

在柔和重新啟動時自訂動畫

軟體重新啟動的參考實作包含可自訂的功能 顯示動畫。

userspace-reboot-fs-remount 動作結束時,init 會啟動 「bootanim」服務。此服務尋找下列項目的存在: 並依序播放找到的第一個動畫檔案:

  • /product/media/userspace-reboot.zip
  • /oem/media/userspace-reboot.zip
  • /system/media/userspace-reboot.zip
,瞭解如何調查及移除這項存取權。

如未指定軟重新啟動特定動畫檔案,bootanim 會顯示 預設 android 動畫。

測試

Android 11 包含 軟重新啟動。此外,您可以使用 CTS 驗證軟重新啟動 測試 UserspaceRebootHostTest