Menerapkan Virtual A/B - Patch

Cherry-pilih patch berikut untuk mengatasi masalah umum berikut.

Periksa ruang yang dapat dialokasikan dengan benar saat melakukan sideloading

Sideloading paket OTA lengkap pada perangkat A/B Virtual yang memiliki partisi super dengan ukuran lebih kecil dari *2 * sum(ukuran grup pembaruan)* mungkin gagal dengan yang 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 lognya:

[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 ceri CL 1399393 , bangun kembali, dan flash partisi boot atau partisi pemulihan jika perangkat tidak menggunakan pemulihan sebagai boot.

Perbaiki kesalahan segmentasi selama penggabungan

Setelah menerapkan pembaruan OTA, selama proses penggabungan VAB, panggilan ke update_engine_client --cancel menyebabkan CleanupPreviousUpdateAction . Potensi kesalahan penunjuk liar juga muncul saat markSlotSuccessful datang terlambat.

Ini diselesaikan dengan menambahkan fungsi StopActionInternal . CleanupPreviousUpdateAction membatalkan tugas yang tertunda saat dihancurkan. Itu mempertahankan variabel yang melacak ID tugas dari tugas yang tertunda di loop pesan. Saat dihancurkan, tugas yang tertunda dibatalkan untuk menghindari segfault.

Pastikan perubahan berikut ada di pohon sumber Android 11 Anda untuk memperbaiki kerusakan SIGSEGV di update_engine selama penggabungan:

  • CL 1439792 (Prasyarat untuk CL 1439372)
  • CL 1439372 ( CleanupPreviousUpdateAction : batalkan tugas yang tertunda saat dihancurkan)
  • CL 1663460 (Perbaiki potensi kesalahan penunjuk liar saat markSlotSuccessful datang terlambat)

Perbaiki slot-switching VAB yang salah, posting pembaruan OTA

Di Android 11 dan yang lebih tinggi, kegagalan menyinkronkan sakelar slot di perangkat setelah pembaruan OTA dapat membuat perangkat menjadi tidak dapat digunakan. Jika implementasi slot-switching IBootControl HAL Anda melakukan penulisan, Anda harus segera menghapus penulisan tersebut. Jika penulisan tidak dihapus, dan perangkat melakukan boot ulang setelah penggabungan dimulai, tetapi sebelum perangkat keras dapat menghapus penulisan sakelar slot, perangkat mungkin kembali ke slot sebelumnya dan gagal melakukan booting.

Untuk solusi kode contoh, lihat CL ini: CL 1535570 .

Cegah penggabungan prematur update_engine

Saat perangkat melakukan booting (Android 11 dan lebih tinggi), dan booting selesai, update_engine memanggil ScheduleWaitMarkBootSuccessful() , dan WaitForMergeOrSchedule() . Ini memulai proses penggabungan. Namun, perangkat reboot ke slot lama. Karena penggabungan sudah dimulai, perangkat gagal untuk boot dan menjadi tidak dapat dioperasikan.

Tambahkan perubahan berikut ke pohon sumber Anda. Perhatikan bahwa CL 1664859 adalah opsional.

  • CL 1439792 (Prasyarat untuk CL 1439372).
  • CL 1439372 ( CleanupPreviousUpdateAction : batalkan tugas yang tertunda saat dihancurkan)
  • CL 1663460 (Perbaiki potensi kesalahan penunjuk liar saat markSlotSuccessful datang terlambat)
  • CL 1664859 (Opsional - tambahkan unittest untuk CleanupPreviousUpdateAction )

Cegah kehilangan atau kerusakan data karena metadata yang dilewati

Di Android 11 dan yang lebih tinggi, jika perangkat penyimpanan memiliki cache tulis-balik yang tidak stabil, dalam kondisi tertentu, metadata dari penggabungan yang telah selesai akan dilewati, yang mengakibatkan hilangnya atau rusaknya data.

Kondisi:

  1. Setelah menyelesaikan operasi penggabungan satu set pengecualian, merge_callback() dipanggil.
  2. Metadata telah diperbarui di perangkat COW yang melacak penyelesaian penggabungan. (Pembaruan ke perangkat COW ini dibersihkan dengan bersih.)

Hasil: Sistem macet karena cache perangkat penyimpanan dari penggabungan baru-baru ini tidak dihapus.

Lihat yang berikut untuk menerapkan resolusi:

Pastikan konfigurasi dm-verity yang benar

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

  • CONFIG_DM_VERITY_AVB=y di kernel
  • Bootloader 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, kesalahan apa pun menyebabkan partisi vbmeta menjadi rusak, dan membuat perangkat non-A/B tidak dapat dioperasikan. Demikian pula, jika penggabungan telah dimulai, perangkat A/B mungkin juga tidak dapat dioperasikan. Hanya gunakan mode kebenaran AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO .

  1. Setel CONFIG_DM_VERITY_AVB=n di kernel
  2. Konfigurasikan perangkat untuk menggunakan mode AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO sebagai gantinya.

Untuk informasi lebih lanjut, dan sebagai praktik, lihat dokumentasi verity: Menangani dm-verity Errors .

Lewati pekerjaan yang sebenarnya sebagai tanggapan atas kesalahan I/O selama shutdown sistem darurat

Di Android 11 dan yang lebih tinggi, jika penonaktifan sistem darurat dipanggil (seperti dalam kasus penonaktifan termal), perangkat dm dapat hidup sementara perangkat blok tidak dapat memproses permintaan I/O lagi. Dalam keadaan ini, kesalahan I/O yang ditangani oleh permintaan I/O dm baru, atau oleh yang sudah dalam penerbangan, dapat menyebabkan keadaan korupsi yang sebenarnya, yang merupakan salah penilaian.

Untuk melewati pekerjaan yang sebenarnya sebagai respons terhadap kesalahan I/O saat sistem dimatikan, gunakan yang berikut ini:

CL 1847875 (Melewati pekerjaan verity sebagai respons terhadap kesalahan I/O selama shutdown)

Pastikan DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED mati

Perangkat Android Go yang menjalankan kernel 4.19 atau yang lebih lama mungkin memiliki DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED=y dalam konfigurasi kernelnya. Pengaturan ini tidak kompatibel dengan Virtual A/B, dan diketahui menyebabkan masalah kerusakan halaman yang jarang terjadi saat keduanya diaktifkan bersamaan.

Untuk kernel 4.19 dan sebelumnya, nonaktifkan dengan mengatur CONFIG_DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED=n di konfigurasi kernel.

Untuk kernel 5.4 dan yang lebih baru, kode telah dihapus dan opsi konfigurasi tidak tersedia.