實作虛擬 A/B 版本修補程式

挑選下列修補程式即可解決下列已知問題。

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

在具有超級系列的虛擬 A/B 裝置上側載完整的 OTA 套件 分區大小小於 *2 * 總和(更新群組的大小)* 可能會失敗 在復原記錄 /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,重新建構並刷新 啟動磁區或復原分區 (如果裝置未做為復原程序使用) 啟動。

修正合併期間的區隔錯誤

在 OTA 更新套用後,在 VAB 合併程序期間,呼叫 update_engine_client --cancel 會導致 CleanupPreviousUpdateAction 當機。A 罩杯 當 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 模式。

詳情請參閱詳細說明文件:處理 dm-verity 錯誤

確認合併檔案設定正確

如果您要分別建構系統映像檔和廠商映像檔,請使用 merge_target_files 進行合併,虛擬 A/B 設定可能 未正確捨棄。為了驗證虛擬 A/B 版本 請套用以下設定 修補程式:CL 2084183 年 (合併動態分區資訊中的相同鍵/值組)

更新必要元件

自 Android 13 起,snapuserd 已從供應商 ramdisk 移至一般性 ramdisk。如果裝置升級至 Android 13,供應商 RAM 磁碟和一般 RAM 磁碟都可能包含 snapuserd 的副本。在本 在這個情況下,虛擬 A/B 需要 snapuserd 的系統副本。為了確保 設定好正確的「snapuserd」副本後,請套用 CL 2031243 年 (將 snapuserd 複製到 first_stage_ramdisk)。