軟重啟

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. SIGTERM發送到在userdata用戶數據後啟動的進程並等待它們停止。
    2. 達到超時後,發送SIGKILL以終止所有正在運行的進程。
    3. 調用/system/bin/vdc volume reset
    4. 卸載 zRAM 支持設備。
    5. 卸載活動的 APEX 包。
    6. 切換回引導裝載命名空間。
    7. 觸發userspace-reboot-resume操作。

如果在軟重啟之前請求了文件系統檢查點,則在userdata userspace-reboot-fs-remount操作期間將用戶數據重新掛載到檢查點模式(有關詳細信息,請參閱以下部分)。在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 包含軟重啟的參考實現。此外,您可以使用UserspaceRebootHostTest中的 CTS 測試來驗證軟重啟。