挑選下列修補程式,以解決下列已知問題。
在側載時正確檢查可用空間
在虛擬 A/B 裝置上側載完整 OTA 套件 (該裝置的超級分區大小小於 *2 * sum(size of update groups)*) 可能會失敗,並在復原記錄 /tmp/recovery.log
中顯示以下內容:
The maximum size of all groups with suffix _b (...) has exceeded half of allocatable space for dynamic partitions ...
以下是記錄的範例:
[INFO:dynamic_partition_control_android.cc(1020)] Will overwrite existing partitions. Slot A may be unbootable until update finishes!
[...]
[ERROR:dynamic_partition_control_android.cc(803)] The maximum size of all groups with suffix _b (2147483648) has exceeded half of allocatable space for dynamic partitions 1073741824.
如果遇到這個問題,請精選 CL 1399393,並在裝置未使用 recovery 做為啟動時,重新建構並閃記啟動分割區或復原分割區。
修正合併期間的區隔錯誤
在 OTA 更新套用後,在 VAB 合併程序期間,呼叫 update_engine_client --cancel
會導致 CleanupPreviousUpdateAction
當機。當 markSlotSuccessful
延遲時,也會發生潛在的萬用字元錯誤。
我們已透過新增 StopActionInternal
函式解決這個問題。CleanupPreviousUpdateAction
會在銷毀時取消待處理的工作。它會維護一個變數,用於追蹤訊息迴圈中待處理工作的工作 ID。在銷毀時,系統會取消待處理的工作,以免發生分段錯誤。
請確認您的 Android 11 來源樹狀結構中包含下列變更,以便修正合併期間 update_engine
中的 SIGSEGV
當機問題:
- CL 1439792 (CL 1439372 的先決條件)
- CL 1439372 (
CleanupPreviousUpdateAction
:在銷毀時取消待處理的工作) - CL 1663460 (修正
markSlotSuccessful
延遲到達時可能發生的野指標錯誤)
防止 update_engine 過早合併
裝置啟動 (Android 11 以上版本) 並完成啟動程序後,update_engine
會呼叫 ScheduleWaitMarkBootSuccessful()
和 WaitForMergeOrSchedule()
。這會啟動合併程序。不過,裝置會重新啟動至舊的插槽。由於合併作業已開始,裝置無法啟動,因此無法運作。
將下列變更加入來源樹狀結構。請注意,CL 1664859 為選用。
- CL 1439792 (CL 1439372 的必要條件)
- CL 1439372 (
CleanupPreviousUpdateAction
:在銷毀時取消待處理的工作) - CL 1663460 (修正
markSlotSuccessful
延遲時潛在的萬用字元指標錯誤) - CL 1664859 (選用 - 為
CleanupPreviousUpdateAction
新增unittest
)
確認 dm-verity 設定正確無誤
在 Android 11 以上版本中,裝置可能會不小心設定下列 dm-verity 選項:
- 核心中的
CONFIG_DM_VERITY_AVB=y
- 系統啟動載入程式已設定為使用任何 verity 模式 (例如
AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE
),但沒有AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
。
在這種裝置設定下,任何驗證錯誤都會導致 vbmeta 分區損毀,並使非 A/B 裝置無法運作。同樣地,如果合併已開始,A/B 裝置也可能無法運作。僅使用 AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
驗證模式。
- 在核心中設定
CONFIG_DM_VERITY_AVB=n
。 - 請將裝置設為改用
AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
模式。
詳情請參閱 verity 說明文件:處理 dm-verity 錯誤。
確認合併檔案的設定正確無誤
如果您分別建構系統映像檔和供應商映像檔,然後使用 merge_target_files
合併這些映像檔,虛擬 A/B 設定可能會在合併程序中遭到誤刪。如要驗證合併目標檔案中的虛擬 A/B 設定是否正確,請套用下列修補程式:CL 2084183 (在動態分割區資訊中合併相同的鍵/值組合)
更新必要元件
自 Android 13 起,snapuserd
已從供應商 RAM 磁碟移至通用 RAM 磁碟。如果裝置升級至 Android 13,供應商 RAM 磁碟和一般 RAM 磁碟都可能包含 snapuserd
的副本。在這種情況下,Virtual A/B 需要 snapuserd
的系統副本。為確保設定正確的 snapuserd
副本,請套用 CL 2031243 (將 snapuserd
複製到 first_stage_ramdisk)。