Sanal A/B yamalarını uygulayın

Aşağıdaki bilinen sorunları gidermek için aşağıdaki yamaları seçin.

Başka cihazdan yükleme yaparken ayrılabilir alanı doğru şekilde kontrol edin

Boyutu *2 * sum(update groups)*'ten küçük bir süper bölümü olan sanal A/B cihaza tam OTA paketini yan yükleme işlemi, /tmp/recovery.log kurtarma günlüğünde aşağıdaki hata mesajıyla başarısız olabilir:

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

Günlüğe örnek:

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

Bu sorunla karşılaşırsanız CL1399393'ü seçin, yeniden oluşturun ve önyükleme bölümüne veya cihaz önyükleme olarak kurtarma kullanmıyorsa kurtarma bölümüne önyükleme yapın.

Birleştirme sırasında segmentasyon hatası düzeltme

OTA güncellemesi uygulandıktan sonra, VAB birleştirme işlemi sırasında update_engine_client --cancel çağrısı CleanupPreviousUpdateAction'un kilitlenmesine neden oluyor. markSlotSuccessful geç geldiğinde de olası bir joker işareti hatası vardır.

Bu sorun, StopActionInternal işlevi eklenerek çözüldü. CleanupPreviousUpdateAction, yok edildiğinde bekleyen görevleri iptal eder. Bu şablonda, mesaj döngüsündeki beklemedeki görevin görev kimliğini izleyen bir değişken bulunur. Yok etme işlemi sırasında beklemedeki görev, hatadan kaçınmak için iptal edilir.

Birleştirme sırasında update_engine'te SIGSEGV kilitlenmelerini düzeltmek için Android 11 kaynak ağacınızda aşağıdaki değişikliklerin bulunduğundan emin olun:

  • CL 1439792 (CL 1439372 için ön koşuldur)
  • CL 1439372 (CleanupPreviousUpdateAction: destroy işleminde bekleyen görevleri iptal et)
  • CL 1663460 (markSlotSuccessful geç geldiğinde olası genel işaretçi hatasını düzeltme)

update_engine'in erken birleştirilmesini engelleme

Bir cihaz (Android 11 ve sonraki sürümler) açıldığında ve açma işlemi tamamlandığında update_engine, ScheduleWaitMarkBootSuccessful() ve WaitForMergeOrSchedule()'yi çağırır. Bu işlem, birleştirme işlemini başlatır. Ancak cihaz, eski yuvada yeniden başlatılır. Birleştirme işlemi zaten başladığından cihaz başlatılamaz ve kullanılamaz hale gelir.

Aşağıdaki değişiklikleri kaynak ağacınıza ekleyin. CL 1664859'un isteğe bağlı olduğunu unutmayın.

  • CL 1439792 (CL 1439372 için bir ön koşul)
  • CL 1439372 (CleanupPreviousUpdateAction: Kaldırma durumunda beklemedeki görevleri iptal etme)
  • CL 1663460 (markSlotSuccessful geç geldiğinde olası rastgele işaretçi hatasını düzeltme)
  • CL 1664859 (isteğe bağlı - CleanupPreviousUpdateAction için unittest ekleyin)

Doğru dm-verity yapılandırmasını kullandığınızdan emin olun

Android 11 ve sonraki sürümlerde cihazlar yanlışlıkla aşağıdaki dm-verity seçenekleriyle yapılandırılabilir:

  • Çekirdekte CONFIG_DM_VERITY_AVB=y
  • AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO olmadan herhangi bir doğrulama modunu (ör. AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE) kullanacak şekilde yapılandırılmış önyükleme yöneticisi.

Bu cihaz yapılandırmasında, doğrulama hataları vbmeta bölümünün bozulmasına neden olur ve A/B olmayan cihazları kullanılamaz hale getirir. Benzer şekilde, bir birleştirme işlemi başladıysa A/B cihazlar da çalışmayabilir. Yalnızca AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO doğrulama modunu kullanın.

  1. Çekirdekte CONFIG_DM_VERITY_AVB=n ayarlayın.
  2. Bunun yerine cihazları AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO modunu kullanacak şekilde yapılandırın.

Daha fazla bilgi için Verity belgelerine bakın: dm-verity hatalarını ele alma.

Birleştirilen dosyanın doğru şekilde yapılandırıldığını onaylama

Sistem görüntülerini ve tedarikçi firma görüntülerini ayrı ayrı oluşturuyorsanız ve bunları birleştirmek için merge_target_files kullanıyorsanız sanal A/B yapılandırmaları, birleştirme işlemi sırasında yanlışlıkla bırakılabilir. Birleştirilen hedef dosyada sanal A/B yapılandırmalarının doğru olduğunu doğrulamak için aşağıdaki yamaları uygulayın: CL 2084183 (dinamik bölüm bilgilerinde aynı anahtar/değer çiftlerini birleştirme)

Gerekli bileşenleri güncelleme

Android 13'ten itibaren snapuserd, tedarikçi ramdisk'inden genel ramdisk'e taşındı. Cihazınız Android 13'e yükseltiliyorsa hem tedarikçi ramdisk'i hem de genel ramdisk'te snapuserd'nin bir kopyası bulunabilir. Bu durumda Sanal A/B, snapuserd sistem kopyasını gerektirir. snapuserd öğesinin doğru kopyasının hazır olduğundan emin olmak için CL 2031243 işlemini uygulayın (snapuserd öğesini first_stage_ramdisk öğesine kopyalayın).