實作虛擬 A/B - 修補程式

挑選下列修補程式,以解決下列已知問題。

在側載時正確檢查可用空間

在虛擬 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 驗證模式。

  1. 在核心中設定 CONFIG_DM_VERITY_AVB=n
  2. 請將裝置設為改用 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)。