Android 10 推出了使用者資料查核點 (UDC),
當 Android 系統處理無線更新時
(OTA) 更新失敗。透過 UDC,如果 Android OTA 更新失敗,裝置可以
以安全的方式復原至先前的狀態雖然
A/B 更新作業解決了這個問題,可用於早期啟動及復原
不支援修改使用者資料分區 (掛接於 /data
)。
UDC 可讓裝置還原使用者資料分區 (即使在 已修改。UDC 功能可利用 檔案系統,在檔案系統不支援時替代實作方式 檢查點,與系統啟動載入程式 A/B 機制整合,同時支援 非 A/B 版本更新,且支援金鑰版本繫結和金鑰復原 預防措施
使用者影響
UDC 功能可改善 OTA 更新體驗,避免使用者流失 更新失敗的資料。這麼做可減少支援呼叫次數 。但如果網路旅行社 更新失敗時,使用者可能會發現裝置多次重新啟動。
運作方式
不同檔案系統中的查核點功能
針對 F2FS 檔案系統,UDC 會在上游新增查核點功能 4.20 Linux 核心並向後移植至裝置支援的所有通用核心 搭載 Android 10
針對其他檔案系統,UDC 會使用名為 dm_bow
的裝置對應虛擬裝置
檢查點功能dm_bow
位於裝置和檔案之間
有些人會將 Cloud Storage 視為檔案系統
但實際上不是分區在掛接時即會發出飾板,導致檔案系統
都發出修剪指令。「dm_bow
」會攔截這類剪輯和使用方式
並設定免費的封鎖清單然後讀取和寫入資料會傳送至裝置
未修改,不過在允許寫入之前,系統會備份還原所需的資料
免付費區塊
查核點程序
掛接含有 checkpoint=fs/block
旗標的分區時,Android 會呼叫
硬碟上的 restoreCheckpoint
,可讓裝置還原任何現有檔案
檢查點。接著,init
會呼叫 needsCheckpoint
函式來判斷
裝置處於系統啟動載入程式 A/B 狀態,或是已設定更新重試作業
數量。如果任一屬性為 true,Android 會呼叫 createCheckpoint
以新增掛接
或建構 dm_bow
裝置
掛接分區後,系統會呼叫檢查點程式碼來發出剪輯。
接著,啟動程序將照常運作。Android 裝置:LOCKED_BOOT_COMPLETE
呼叫 commitCheckpoint
來提交目前的查核點和更新
繼續正常運作
管理 Keymaster 金鑰
Keymaster 金鑰可用於裝置加密或其他用途。如要管理這些 鍵,Android 會延遲刪除鍵刪除呼叫,直到檢查點提交為止。
監控健康狀態
健康狀態 Daemon 會確認磁碟空間是否足夠
檢查點。健康 Daemon 位於
cp_healthDaemon
敬上
位置:Checkpoint.cpp
。
健康狀態 Daemon 具有以下可設定的行為:
ro.sys.cp_msleeptime
: 控管裝置檢查磁碟用量的頻率。ro.sys.cp_min_free_bytes
: 控管健康狀態 Daemon 尋找的最小值。ro.sys.cp_commit_on_full
: 控制健康 Daemon 是否要重新啟動裝置, 並在磁碟已滿時繼續。
Checkpoint API
UDC 功能會使用 Checkpoint API。如要瞭解 UDC 使用的其他 API,請參閱
IVold.aidl
。
void startCheckpoint(int 重試)
建立查核點。
架構在準備開始更新時,會呼叫這個方法。
系統會先建立查核點,再建立查核點
重新啟動後已掛接 R/W。如果重試次數為正數,API 會處理
追蹤重試,而更新工具會呼叫 needsRollback
來檢查是否復原
需要更新如果重試次數為 -1
,API 會遵從 A/B 版本
系統啟動載入程式的判斷方式。
執行一般 A/B 更新時,不會呼叫此方法。
voidCommitChanges()
提交變更。
當變更準備就緒時,架構會在重新啟動後呼叫這個方法
。系統會在資料 (例如圖片、影片、簡訊、伺服器等) 之前呼叫這個方法
收據) 會在 BootComplete
之前寫入使用者資料。
如果沒有任何執行中的查核點更新,此方法就不會有任何作用。
abortChanges()
強制重新啟動並還原為查核點。捨棄所有使用者資料修改內容 。
架構會在重新啟動後但 commitChanges
之前呼叫這個方法。
呼叫此方法時,retry_counter
會減少。記錄項目為
。
bool requirementsRollback()
決定是否需要復原。
在非查核點裝置上,傳回 false
。在查核點裝置上傳回 true
自動檢查功能
實作 UDC
參照實作
如需實作 UDC 的範例,請參閱 dm-bow.c。 如需關於功能的其他文件,請參閱 dm-bow.txt。
設定
在 init.hardware.rc
檔案的 on fs
中,請確認符合下列條件:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
在 init.hardware.rc
檔案的 on late-fs
中,請確認符合下列條件:
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
在您的 fstab.hardware
檔案中,確定 /data
已標記為 latemount
。
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,fileencryption=ice,keydirectory=/metadata/vold/metadata_encryption,quota,formattable,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,reservedsize=128M,checkpoint=fs
新增中繼資料分區
UDC 需要中繼資料分區來儲存非系統啟動載入程式的重試次數,
鍵。設定中繼資料分區,並提早在 /metadata
掛接。
在您的 fstab.hardware
檔案中,確定 /metadata
已標記為 earlymount
或 first_stage_mount
。
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
將分區初始化為所有零。
在 BoardConfig.mk
中新增以下幾行內容:
BOARD_USES_METADATA_PARTITION := true BOARD_ROOT_EXTRA_FOLDERS := existing_folders metadata
更新系統
F2FS 系統
如果系統使用 F2FS 設定資料格式,請確認 F2FS 版本 支援查核點如需詳細資訊,請參閱 Checkpoint 功能 不同的檔案系統
將 checkpoint=fs
標記新增至 Fstab 的 <fs_mgr_flags>
區段
裝置掛接位置為 /data
。
非 F2FS 系統
如為非 F2FS 系統,必須在核心設定中啟用 dm-bow
。
將 checkpoint=block
標記新增至 Fstab 的 <fs_mgr_flags>
區段
裝置掛接位置為 /data
。
查看記錄
呼叫 Checkpoint API 時會產生記錄項目。
驗證
如要測試 UDC 實作,請執行 VtsKernelCheckpointTest
的 VTS 組合
測試。