Android 11 支持軟重啟,即用戶空間中進程的運行時重啟,用於應用需要重啟的更新(例如,對 APEX 包的更新)。目前,軟重啟僅限於userdata
用戶數據後啟動的進程。
通過以下方式請求軟重啟:
從
PowerManager
,通過調用PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
從 shell,使用
adb shell svc power reboot userspace
或adb reboot userspace
軟重啟後,憑據加密存儲保持解鎖狀態。
如果設備支持軟重啟,則PowerManager.isRebootingUserspace()
API 方法返回true
,系統屬性init.userspace_reboot.is_supported
的值等於1
。
如果設備不支持軟重啟,則調用PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
、 adb reboot userspace
和adb shell svc power reboot userspace
失敗。
軟重啟執行
請求軟重啟後(通過PowerManager
或從 shell), init
執行以下步驟:
接收
sys.powerctl=reboot,userspace
。派生一個單獨的
UserspaceRebootWatchdogThread()
進程來監視軟重啟。觸髮
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
操作。-
運行
DoUserspaceReboot
函數,該函數執行以下操作:- 將
SIGTERM
發送到在userdata
用戶數據後啟動的進程並等待它們停止。 - 達到超時後,發送
SIGKILL
以終止所有正在運行的進程。 - 調用
/system/bin/vdc volume reset
。 - 卸載 zRAM 支持設備。
- 卸載活動的 APEX 包。
- 切換回引導裝載命名空間。
- 觸發
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
控制設備何時可以執行軟重啟。如果此屬性的值為false
、0
或未指定,則拒絕重新啟動嘗試。 -
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 測試來驗證軟重啟。