請挑選下列修補程式,解決下列已知問題。
側載時正確檢查可分配空間
如果虛擬 A/B 裝置的超級分割區大小小於 *2 * sum(更新群組大小)*,側載完整 OTA 套件可能會失敗,且復原記錄中會出現以下內容 /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 損毀。如果 markSlotSuccessful 延遲送達,也可能發生指標錯誤。
新增 StopActionInternal 函式後,這個問題就解決了。
CleanupPreviousUpdateAction 會在銷毀時取消待處理工作。這個變數會追蹤訊息迴圈中待處理工作的 ID。在 destroy 時,系統會取消待處理的工作,避免發生區段錯誤。
請確認 Android 11 來源樹狀結構中包含下列變更,以修正合併期間 update_engine 中的 SIGSEGV
當機問題:
- CL 1439792 (CL 1439372 的必要條件)
- CL 1439372
(
CleanupPreviousUpdateAction: cancel pending tasks on destroy) - CL 1663460 (修正
markSlotSuccessful延遲時可能發生的任意指標錯誤)
防止 update_engine 過早合併
裝置啟動 (Android 11 以上版本) 並完成啟動後,系統會呼叫 update_engine、ScheduleWaitMarkBootSuccessful() 和 WaitForMergeOrSchedule()。系統會隨即開始合併程序。不過,裝置會重新啟動至舊插槽。由於合併作業已開始,裝置無法開機,因此無法運作。
在來源樹狀結構中加入下列變更。請注意,CL 1664859 為選用。
- CL 1439792 (CL 1439372 的必要條件)
- CL 1439372
(
CleanupPreviousUpdateAction: cancel pending tasks on destroy) - CL 1663460 (修正
markSlotSuccessful延遲時可能發生的任意指標錯誤) - CL 1664859 (選用 -
新增
unittest適用於CleanupPreviousUpdateAction)
確認 dm-verity 設定正確無誤
在 Android 11 以上版本中,裝置可能會不慎設定下列 dm-verity 選項:
CONFIG_DM_VERITY_AVB=y核心- 系統啟動載入程式已設定為使用任何驗證模式 (例如
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 的副本。在這種情況下,虛擬 A/B 測試需要 snapuserd 的系統副本。為確保 snapuserd 的正確副本位於適當位置,請套用 CL 2031243 (將 snapuserd 複製到 first_stage_ramdisk)。