Android 11 支援軟體重新啟動,
使用者空間內程序重新啟動時,用於套用
需要重新啟動 (例如更新 APEX 套件)。目前調低音量
只有掛接 userdata
後啟動的程序才會重新啟動。
請按照以下方式要求軟重新啟動:
通話來源:
PowerManager
PowerManager.reboot(PowerManager.REBOOT_USERSPACE)
從殼層使用
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
或殼層)
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
上述屬性應在啟動序列期間再次設定。如有需要: 重設其他屬性。相關範例請參閱
on userspace-reboot-requested
:rootdir/init.rc
。執行
DoUserspaceReboot
函式,用於執行下列動作:- 將
SIGTERM
傳送至掛接userdata
之後啟動的處理程序, 等待系統停止執行 - 達到逾時時間後,傳送
SIGKILL
終止任何執行中的作業 作業。 - 呼叫
/system/bin/vdc volume reset
。 - 卸載 zRAM 備用裝置。
- 卸載使用中的 APEX 套件。
- 切換回啟動掛接掛接命名空間。
- 觸發
userspace-reboot-resume
動作。
- 將
如果要求在軟重新啟動前要求檔案系統查核點,
userdata
會在以下期間重新掛接為檢查點模式:
userspace-reboot-fs-remount
動作 (詳情請參閱下節)。A 罩杯
設定 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 包含
軟重新啟動。此外,您可以使用 CTS 驗證軟重新啟動
測試
UserspaceRebootHostTest
。