2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
仮想 A/B の実装 - パッチ
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
以下のパッチを選択して、既知の問題に対処してください。
サイドローディング時に割り当て可能なスペースを正しくチェックする
サイズが 2 × アップデート グループのサイズ合計よりも小さい super パーティションの仮想 A/B デバイスでフル 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 を選択し、デバイスが boot パーティションとして recovery パーティションを使用していない場合は、boot パーティションまたは recovery パーティションを再ビルドしてフラッシュします。
マージ中のセグメンテーション違反を修正する
OTA アップデートを適用した後、VAB のマージの処理中に update_engine_client --cancel
を呼び出すと、CleanupPreviousUpdateAction
がクラッシュします。markSlotSuccessful
が遅延すると、ワイルド ポインタのエラーが発生する可能性もあります。
これは、StopActionInternal
関数の追加によって解決されました。CleanupPreviousUpdateAction
は破棄の際に保留中のタスクをキャンセルします。メッセージ ループ内で保留中のタスクのタスク ID を追跡する変数は維持されます。破棄の際は、セグメンテーション違反の発生を防ぐために、保留中のタスクがキャンセルされます。
マージ中に発生する update_engine
での SIGSEGV
のクラッシュを修正するには、Android 11 ソースツリーで次の変更を適用します。
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
AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
なしで任意の verity モード(AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE
など)を使用するように設定されたブートローダー
このデバイス設定では、verity エラーがあると vbmeta パーティションが破損し、非 A/B デバイスが動作しなくなります。同様に、マージが開始されると、A/B デバイスも動作しなくなる可能性があります。AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO
verity モードのみを使用します。
- カーネルで
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(動的パーティション情報内の同一の Key-Value ペアをマージする)というパッチを適用します。
必要なコンポーネントを更新する
Android 13 では、snapuserd
をベンダー RAM ディスクから汎用 RAM ディスクに移動しました。デバイスを Android 13 にアップグレードする場合、ベンダー RAM ディスクと汎用 RAM ディスクの両方に snapuserd
のコピーが含まれる可能性があります。この場合、仮想 A/B には snapuserd
のシステムコピーが必要になります。snapuserd
の正しいコピーを確実に配置するには、CL 2031243(snapuserd
を first_stage_ramdisk にコピーする)を適用します。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-03-26 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-03-26 UTC。"],[],[],null,["# Implement Virtual A/B - patches\n\nCherry-pick the following patches to address the following known issues.\n\n### Check allocatable space correctly when sideloading\n\nSideloading a full OTA package on a Virtual A/B device that has a super\npartition with a size smaller than \\*2 \\* sum(size of update groups)\\* may fail\nwith the following in recovery log `/tmp/recovery.log`: \n\n The maximum size of all groups with suffix _b (...) has exceeded half of allocatable space for dynamic partitions ...\n\nHere is an example of the log: \n\n [INFO:dynamic_partition_control_android.cc(1020)] Will overwrite existing partitions. Slot A may be unbootable until update finishes!\n [...]\n [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.\n\nIf you encounter this issue, cherry pick [CL\n1399393](https://android-review.googlesource.com/1399393), rebuild, and flash\nthe boot partition or recovery partition if the device doesn't use recovery as\nboot.\n\n### Fix segmentation fault during merge\n\nAfter applying an OTA update, during the VAB merge process, a call to\n`update_engine_client --cancel` causes `CleanupPreviousUpdateAction` to crash. A\npotential wild pointer error also exists when `markSlotSuccessful` comes late.\n\nThis was resolved by adding the `StopActionInternal` function.\n`CleanupPreviousUpdateAction` cancels pending tasks on destroy. It maintains a\nvariable that tracks the task ID of the pending task in the message loop. On\ndestroy, the pending task is canceled to avoid segfault.\n\nEnsure the following changes are in your Android 11 source tree to fix `SIGSEGV`\ncrashes in `update_engine` during merge:\n\n- [CL 1439792](https://android-review.googlesource.com/1439792) (a prerequisite to CL 1439372)\n- [CL 1439372](https://android-review.googlesource.com/1439372) (`CleanupPreviousUpdateAction`: cancel pending tasks on destroy)\n- [CL 1663460](https://android-review.googlesource.com/1663460) (fix the potential wild pointer error when `markSlotSuccessful` comes late)\n\n### Prevent update_engine premature merge\n\nWhen a device boots (Android 11 and higher), and the boot completes, the\n`update_engine` calls `ScheduleWaitMarkBootSuccessful()`, and\n`WaitForMergeOrSchedule()`. This starts the merge process. However, the device\nreboots to the old slot. Because the merge already started, the device fails to\nboot and becomes inoperable.\n\nAdd the following changes to your source tree. Note that CL 1664859 is optional.\n\n- [CL 1439792](https://android-review.googlesource.com/1439792) (a prerequisite to CL 1439372)\n- [CL 1439372](https://android-review.googlesource.com/1439372) (`CleanupPreviousUpdateAction`: cancel pending tasks on destroy)\n- [CL 1663460](https://android-review.googlesource.com/1663460) (fix the potential wild pointer error when `markSlotSuccessful` comes late)\n- [CL 1664859](https://android-review.googlesource.com/1664859) (optional - add `unittest` for `CleanupPreviousUpdateAction`)\n\n### Ensure the correct dm-verity configuration\n\nIn Android 11 and higher, devices can be inadvertently configured with the\nfollowing dm-verity options:\n\n- `CONFIG_DM_VERITY_AVB=y` in the kernel\n- The bootloader configured to use any verity mode, (such as `AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE`), without `AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO`.\n\nWith this device configuration, any verity error causes the vbmeta partition to\nbecome corrupted, and renders non-A/B devices inoperable. Similarly, if a merge\nhas started, A/B devices might also become inoperable. Only use the\n`AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO` verity mode.\n\n1. Set `CONFIG_DM_VERITY_AVB=n` in the kernel.\n2. Configure devices to use the `AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO` mode instead.\n\nFor more information reference the verity documentation: [Handling dm-verity\nErrors](https://android.googlesource.com/platform/external/avb/+/android16-release/README.md#Handling-dm_verity-Errors).\n\n### Confirm the merged file is correctly configured\n\nIf you are building system images and vendor images separately, then using\n`merge_target_files` to merge them, Virtual A/B configurations might be\nincorrectly dropped during the merge process. To verify that Virtual A/B\nconfigurations are correct in the merged target file, apply the following\npatches: [CL\n2084183](https://android-review.googlesource.com/c/platform/build/+/2084183/)\n(merge identical key/val pairs in dynamic partition info)\n\n### Update necessary components\n\nAs of Android 13, `snapuserd` has been moved from vendor ramdisk to generic\nramdisk. If your device is upgrading to Android 13, it is possible that both\nvendor ramdisk and generic ramdisk contain a copy of `snapuserd`. In this\nsituation, Virtual A/B requires the system copy of `snapuserd`. To ensure that\nthe correct copy of `snapuserd` is in place, apply [CL\n2031243](https://android-review.googlesource.com/c/platform/system/core/+/2031243/)\n(copy `snapuserd` to first_stage_ramdisk)."]]