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
函數,該函數執行以下操作:- 向掛載
userdata
後啟動的進程發送SIGTERM
並等待它們停止。 - 達到逾時後,發送
SIGKILL
來終止任何正在執行的進程。 - 呼叫
/system/bin/vdc volume reset
。 - 卸載 zRAM 支援設備。
- 卸載活動的 APEX 包。
- 切換回引導掛載命名空間。
- 觸發
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
控制裝置何時可以執行軟重啟。如果此屬性的值為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 測試來驗證軟重啟。