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çinunittest
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:
- Bir istisna kümesinin birleştirme işlemi tamamlandıktan sonra
merge_callback()
çağrıldı. - 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.
- Çekirdekte
CONFIG_DM_VERITY_AVB=n
değerini ayarlayın - 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).