Sanal A/B yamalarını uygulama

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

Yan yükleme yaparken ayrılabilir alanı doğru şekilde kontrol etme

*2 * sum(size of update groups) değerinden daha küçük bir süper bölümü olan bir Virtual A/B cihazına tam OTA paketi yan yüklenirken kurtarma günlüğünde /tmp/recovery.log ile aşağıdaki hata oluşabilir:

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

Günlüğe bir ö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 CL 1399393'ü seçin, yeniden oluşturun ve cihaz önyükleme için kurtarma kullanmıyorsa önyükleme bölümünü veya kurtarma bölümünü flaşlayın.

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

OTA güncellemesi uygulandıktan sonra, VAB birleştirme işlemi sırasında update_engine_client --cancel çağrısı CleanupPreviousUpdateAction öğesinin kilitlenmesine neden oluyor. A potential wild pointer error also exists when markSlotSuccessful comes late.

Bu sorun, StopActionInternal işlevi eklenerek çözüldü. CleanupPreviousUpdateAction, yok etme sırasında bekleyen görevleri iptal eder. İleti döngüsündeki bekleyen görevin görev kimliğini izleyen bir değişkeni korur. On destroy çağrıldığında, segmentasyon hatasını önlemek için bekleyen görev iptal edilir.

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

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

update_engine'in erken birleştirilmesini önleme

Bir cihaz başlatıldığında (Android 11 ve sonraki sürümler) ve başlatma işlemi tamamlandığında update_engine, ScheduleWaitMarkBootSuccessful() ve WaitForMergeOrSchedule() çağrılır. Bu işlem, birleştirme sürecini başlatır. Ancak cihaz, eski yuvada yeniden başlatılır. Birleştirme işlemi zaten başladığı için cihaz başlatılamıyor ve kullanılamaz hale geliyor.

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

  • CL 1439792 (CL 1439372 için ön koşuldur)
  • CL 1439372 (CleanupPreviousUpdateAction: yok etme işleminde bekleyen görevleri iptal etme)
  • CL 1663460 (markSlotSuccessful geç geldiğinde olası geçersiz 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ı sağlama

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

  • Çekirdekteki CONFIG_DM_VERITY_AVB=y
  • Önyükleyici, AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO olmadan herhangi bir doğruluk modunu (ör. AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE) kullanacak şekilde yapılandırılmış.

Bu cihaz yapılandırmasında, herhangi bir doğruluk hatası vbmeta bölümünün bozulmasına neden olur ve A/B olmayan cihazlar kullanılamaz hale gelir. Benzer şekilde, birleştirme işlemi başlatıldıysa A/B cihazları da kullanılamaz hale gelebilir. Yalnızca AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO doğruluk modunu kullanın.

  1. Çekirdekte CONFIG_DM_VERITY_AVB=n değerini ayarlayın.
  2. Cihazları bunun yerine AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO modunu kullanacak şekilde yapılandırın.

Daha fazla bilgi için doğruluk belgelerine bakın: dm-verity Hatalarını Ele Alma.

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

Sistem görüntülerini ve satıcı görüntülerini ayrı ayrı oluşturup merge_target_files kullanarak birleştiriyorsanız birleştirme işlemi sırasında sanal A/B yapılandırmaları yanlışlıkla bırakılabilir. Birleştirilmiş hedef dosyadaki 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 bilgilerindeki aynı anahtar/değer çiftlerini birleştirin)

Gerekli bileşenleri güncelleyin

Android 13'ten itibaren snapuserd, vendor ramdisk'ten genel ramdisk'e taşındı. Cihazınız Android 13'e yükseltiliyorsa hem satıcı ramdisk'i hem de genel ramdisk, snapuserd dosyasının bir kopyasını içerebilir. Bu durumda, sanal A/B testi için snapuserd uygulamasının sistem kopyası gerekir. snapuserd öğesinin doğru kopyasının bulunduğundan emin olmak için CL 2031243'ü uygulayın (snapuserd öğesini first_stage_ramdisk'e kopyalayın).