Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

軟重啟

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

    在引導過程中,應再次設置以上屬性。如果需要,您可以重置其他屬性。有關示例,請參閱rootdir/init.rcon 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_user0vold將密鑰重新安裝在文件系統密鑰環中。

退回硬重啟

為確保軟重啟不會使設備處於無法使用的狀態,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 。如果設備未能unmout 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測試來驗證軟重啟。