Sanal A/B yamalarını uygulayın

Aşağıdaki bilinen sorunları çözmek için aşağıdaki yamaları özenle seçin.

Yandan yükleme yaparken ayrılabilir alanı doğru şekilde kontrol edin

*2 * toplam(güncelleme gruplarının boyutu)* boyutundan daha küçük bir süper bölüme sahip bir Sanal A/B cihazına tam bir OTA paketinin yandan yüklenmesi, /tmp/recovery.log kurtarma günlüğünde aşağıdakilerle başarısız olabilir:

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

İşte günlüğün bir örneği:

[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 aygıt kurtarmayı önyükleme olarak kullanmıyorsa önyükleme bölümünü veya kurtarma bölümünü flashlayın.

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

Bir OTA güncellemesi uygulandıktan sonra, VAB birleştirme işlemi sırasında update_engine_client --cancel çağrısı CleanupPreviousUpdateAction çökmesine neden olur. markSlotSuccessful geç geldiğinde potansiyel bir çılgın işaretçi hatası da ortaya çıkar.

Bu sorun, StopActionInternal işlevi eklenerek çözüldü. CleanupPreviousUpdateAction yok etme sırasında bekleyen görevleri iptal eder. Mesaj döngüsünde bekleyen görevin görev kimliğini izleyen bir değişkeni korur. Yok etme sırasında segfault'u önlemek için bekleyen görev iptal edilir.

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

  • CL 1439792 (CL 1439372'nin ön koşulu)
  • CL 1439372 ( CleanupPreviousUpdateAction : imha sırasında bekleyen görevleri iptal et)
  • CL 1663460 ( markSlotSuccessful geç geldiğinde olası joker işaretçi hatasını düzeltin)

VAB'ın yanlış yuva değiştirmesini düzeltin, OTA güncellemesini yayınlayın

Android 11 ve üzeri sürümlerde, OTA güncellemesinden sonra cihazdaki yuva anahtarının senkronize edilememesi, cihazı kullanılamaz duruma getirebilir. IBootControl HAL'inizin yuva değiştirme uygulaması yazma işlemleri gerçekleştiriyorsa, bu yazma işlemlerini hemen temizlemeniz gerekir. Yazmalar temizlenmezse ve birleştirme başladıktan sonra cihaz yeniden başlatılırsa ancak donanım yuva anahtarı yazma işlemini temizlemeden önce cihaz önceki yuvaya dönebilir ve önyükleme yapamayabilir.

Örnek kod çözümü için şu CL'yi görüntüleyin: CL 1535570 .

update_engine'in erken birleşmesini önleyin

Bir cihaz önyüklendiğinde (Android 11 ve üstü) ve önyükleme tamamlandığında update_engine , ScheduleWaitMarkBootSuccessful() ve WaitForMergeOrSchedule() çağırır. Bu, birleştirme işlemini başlatır. Ancak cihaz eski yuvaya yeniden başlatılır. Birleştirme zaten başlatıldığı için aygıt önyükleme yapamıyor ve çalışmaz 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'nin ön koşulu)
  • CL 1439372 ( CleanupPreviousUpdateAction : imha sırasında bekleyen görevleri iptal et)
  • CL 1663460 ( markSlotSuccessful geç geldiğinde olası joker işaretçi hatasını düzeltin)
  • CL 1664859 (isteğe bağlı - CleanupPreviousUpdateAction için unittest ekleyin)

Atlanan meta veriler nedeniyle veri kaybını veya bozulmayı önleyin

Android 11 ve sonraki sürümlerde, bir depolama cihazının geçici bir geri yazma önbelleği varsa belirli koşullar altında tamamlanmış bir birleştirmenin meta verileri atlanır ve bu da veri kaybına veya bozulmasına neden olur.

Koşullar:

  1. Bir istisna kümesinin birleştirme işlemi tamamlandıktan sonra merge_callback() çağrıldı.
  2. Meta veriler, birleştirme işleminin tamamlanmasını izleyen COW cihazında güncellendi. (COW cihazına yönelik bu güncelleme temiz bir şekilde temizlendi.)

Sonuç: Depolama cihazının son birleştirme önbelleğinin temizlenmemesi nedeniyle sistem çöktü.

Bir çözümü uygulamak için aşağıdakilere bakın:

Doğru dm-verity yapılandırmasını sağlayın

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

  • CONFIG_DM_VERITY_AVB=y çekirdekte
  • Önyükleyici, AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE gibi, AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO olmadan herhangi bir gerçeklik modunu kullanacak şekilde yapılandırılmıştır.

Bu cihaz yapılandırmasında herhangi bir doğrulama hatası vbmeta bölümünün bozulmasına neden olur ve A/B olmayan cihazları çalışmaz hale getirir. Benzer şekilde, birleştirme başlamışsa A/B cihazları da çalışmaz hale gelebilir. Yalnızca AVB_HASHTREE_ERROR_MODE_MANAGED_RESTART_AND_EIO doğrulama 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 ve pratik olarak verity belgelerine bakın: Handling dm-verity Errors .

Acil durum sistemi kapatması sırasında bir G/Ç hatasına yanıt olarak doğrulama çalışmasını atlayın

Android 11 ve sonraki sürümlerde, acil sistem kapatma çağrısı yapılırsa (termal kapatma durumunda olduğu gibi), blok cihaz artık G/Ç isteklerini işleyemezken bir dm cihazı canlı olabilir. Bu durumda, yeni dm I/O istekleri veya halihazırda hareket halindekiler tarafından işlenen I/O hataları, yanlış bir karar olan gerçeklik bozulması durumuna yol açabilir.

Sistem kapatılırken bir G/Ç hatasına yanıt olarak doğrulama çalışmasını atlamak için aşağıdakileri kullanın:

CL 1847875 (Kapatma sırasında G/Ç hatasına yanıt olarak doğrulama çalışmasını atlar)

DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED'nin kapalı olduğundan emin olun

4.19 çekirdeği veya önceki sürümünü çalıştıran Android Go cihazlarının çekirdek yapılandırmasında DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED=y bulunabilir. Bu ayar Virtual A/B ile uyumlu değildir ve her ikisi birlikte etkinleştirildiğinde nadir görülen sayfa bozulması sorunlarına neden olduğu bilinmektedir.

4.19 ve önceki çekirdekler için, çekirdek yapılandırmasında CONFIG_DM_ANDROID_VERITY_AT_MOST_ONCE_DEFAULT_ENABLED=n ayarını yaparak bunu devre dışı bırakın.

5.4 ve üzeri çekirdekler için kod kaldırılmıştır ve yapılandırma seçeneği mevcut değildir.

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

Sistem görüntülerini ve satıcı görüntülerini ayrı ayrı oluşturuyorsanız ve bunları birleştirmek için merge_target_files kullanıyorsanız, birleştirme işlemi sırasında Sanal A/B yapılandırmaları hatalı şekilde bırakılabilir. Birleştirilmiş hedef dosyada Sanal A/B yapılandırmalarının doğru olduğunu doğrulamak için aşağıdaki düzeltme eklerini uygulayın: CL 2084183 (dinamik bölüm bilgisinde aynı anahtar/değer çiftlerini birleştirme)

Gerekli bileşenleri güncelleyin

Android 13'ten itibaren snapuserd , satıcının ramdiskinden genel ramdisk'e taşındı. Cihazınız Android 13'e yükseltiliyorsa, hem satıcının ramdiskinin hem de genel ramdiskin snapuserd kopyasını içermesi mümkündür. Bu durumda Virtual A/B, snapuserd sistem kopyasını gerektirir. snapuserd doğru kopyasının mevcut olduğundan emin olmak için CL 2031243'ü uygulayın ( snapuserd kopyalayın).