軟重啟

Android 11 支援軟重啟,這是用戶空間中進程的運行時重啟,用於應用需要重新啟動的更新(例如,APEX 軟體包的更新)。目前,軟重啟僅限於掛載userdata後啟動的進程。

透過以下方式請求軟重啟:

  • PowerManager ,透過呼叫PowerManager.reboot(PowerManager.REBOOT_USERSPACE)

  • 從 shell 中,使用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或從 shell), 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

    應在啟動順序期間再次設定上述屬性。如果需要,您可以重設其他屬性。例如,請參閱rootdir/init.rc中的on userspace-reboot-requested作業。

  4. 執行DoUserspaceReboot函數,該函數執行以下操作:

    1. 向掛載userdata後啟動的進程發送SIGTERM並等待它們停止。
    2. 達到逾時後,發送SIGKILL來終止任何正在執行的進程。
    3. 呼叫/system/bin/vdc volume reset
    4. 卸載 zRAM 支援設備。
    5. 卸載活動的 APEX 包。
    6. 切換回引導掛載命名空間。
    7. 觸發userspace-reboot-resume操作。

如果在軟重啟之前請求檔案系統檢查點,則在userspace-reboot-fs-remount操作期間將userdata重新安裝到檢查點模式(有關詳細信息,請參閱以下部分)。將sys.boot_completed property設為1後,將考慮軟重啟。軟重啟結束時,顯示器保持關閉狀態,需要明確的使用者互動才能喚醒它。

檔案系統檢查點

如果在軟重啟之前請求檔案系統檢查點,則在軟重啟期間userdata將以檢查點模式重新掛載。重新掛載邏輯在fs_mgr_remount_userdata_into_checkpointing函數中實現,並且在檢查點方法之間有所不同。具體來說,當userdata支援:

  • 檔案系統層級檢查點(例如f2fs ),使用checkpoint=disable選項重新掛載userdata

  • 區塊級檢查點(例如, 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 包含軟重啟的參考實作。此外,您可以使用UserspaceRebootHostTest中的 CTS 測試來驗證軟重啟。