Mengimplementasikan A/B Virtual - patch

Pilih patch berikut untuk mengatasi masalah umum berikut.

Memeriksa ruang yang dapat dialokasikan dengan benar saat melakukan sideload

Sideload paket OTA lengkap di perangkat Virtual A/B yang memiliki partisi super dengan ukuran lebih kecil dari *2 * sum(size of update groups)* dapat gagal dengan pesan berikut di log pemulihan /tmp/recovery.log:

The maximum size of all groups with suffix _b (...) has exceeded half of allocatable space for dynamic partitions ...

Berikut adalah contoh log:

[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.

Jika Anda mengalami masalah ini, pilih CL 1399393, build ulang, dan flash partisi booting atau partisi pemulihan jika perangkat tidak menggunakan pemulihan sebagai booting.

Memperbaiki error segmentasi selama penggabungan

Setelah menerapkan update OTA, selama proses penggabungan VAB, panggilan ke update_engine_client --cancel menyebabkan CleanupPreviousUpdateAction error. Kemungkinan error pointer liar juga ada saat markSlotSuccessful terlambat.

Hal ini diselesaikan dengan menambahkan fungsi StopActionInternal. CleanupPreviousUpdateAction membatalkan tugas yang tertunda saat dihancurkan. Fungsi ini mempertahankan variabel yang melacak ID tugas dari tugas yang tertunda dalam loop pesan. Saat dihancurkan, tugas yang tertunda akan dibatalkan untuk menghindari segfault.

Pastikan perubahan berikut ada di hierarki sumber Android 11 untuk memperbaiki error SIGSEGV di update_engine selama penggabungan:

  • CL 1439792 (prasyarat untuk CL 1439372)
  • CL 1439372 (CleanupPreviousUpdateAction: membatalkan tugas yang tertunda saat dihancurkan)
  • CL 1663460 (memperbaiki potensi error pointer liar saat markSlotSuccessful terlambat)

Mencegah penggabungan update_engine yang terlalu dini

Saat perangkat melakukan booting (Android 11 dan yang lebih baru), dan booting selesai, update_engine akan memanggil ScheduleWaitMarkBootSuccessful(), dan WaitForMergeOrSchedule(). Tindakan ini akan memulai proses penggabungan. Namun, perangkat akan dimulai ulang ke slot lama. Karena penggabungan sudah dimulai, perangkat gagal di-booting dan tidak dapat beroperasi.

Tambahkan perubahan berikut ke hierarki sumber Anda. Perhatikan bahwa CL 1664859 bersifat opsional.

  • CL 1439792 (prasyarat untuk CL 1439372)
  • CL 1439372 (CleanupPreviousUpdateAction: membatalkan tugas yang tertunda saat dihancurkan)
  • CL 1663460 (memperbaiki potensi error pointer liar saat markSlotSuccessful terlambat)
  • CL 1664859 (opsional - tambahkan unittest untuk CleanupPreviousUpdateAction)

Memastikan konfigurasi dm-verity yang benar

Di Android 11 dan yang lebih baru, perangkat dapat secara tidak sengaja dikonfigurasi dengan opsi dm-verity berikut:

  • CONFIG_DM_VERITY_AVB=y di kernel
  • Bootloader yang dikonfigurasi untuk menggunakan mode verity apa pun, (seperti AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE), tanpa AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO.

Dengan konfigurasi perangkat ini, error verity apa pun akan menyebabkan partisi vbmeta rusak, dan membuat perangkat non-A/B tidak dapat beroperasi. Demikian pula, jika penggabungan telah dimulai, perangkat A/B mungkin juga tidak dapat beroperasi. Hanya gunakan mode verity AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO.

  1. Tetapkan CONFIG_DM_VERITY_AVB=n di kernel.
  2. Konfigurasikan perangkat untuk menggunakan mode AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO.

Untuk informasi selengkapnya, lihat dokumentasi verity: Menangani Error dm-verity.

Pastikan file gabungan dikonfigurasi dengan benar

Jika Anda mem-build image sistem dan image vendor secara terpisah, lalu menggunakan merge_target_files untuk menggabungkannya, konfigurasi A/B Virtual mungkin tidak dihapus dengan benar selama proses penggabungan. Untuk memverifikasi bahwa konfigurasi Virtual A/B sudah benar dalam file target yang digabungkan, terapkan patch berikut: CL 2084183 (gabungkan pasangan kunci/nilai yang identik dalam info partisi dinamis)

Memperbarui komponen yang diperlukan

Mulai Android 13, snapuserd telah dipindahkan dari ramdisk vendor ke ramdisk generik. Jika perangkat Anda diupgrade ke Android 13, mungkin ramdisk vendor dan ramdisk generik berisi salinan snapuserd. Dalam situasi ini, A/B Virtual memerlukan salinan sistem snapuserd. Untuk memastikan bahwa salinan snapuserd yang benar sudah diterapkan, terapkan CL 2031243 (salin snapuserd ke first_stage_ramdisk).