Sanal A/B'yi uygulayın

Yeni bir cihazda sanal A/B testi uygulamak veya kullanıma sunulmuş bir cihazda sonradan uyumlulaştırma yapmak için cihaza özgü kodda değişiklik yapmanız gerekir.

İşaret oluşturma

Sanal A/B kullanan cihazlar A/B cihazı olarak yapılandırılmış ve dinamik bölümlerle başlatılmış olmalıdır.

Sanal A/B ile başlatılan cihazları, sanal A/B cihaz temel yapılandırmasını devralacak şekilde ayarlayın:

$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk)

Sanal A/B ile kullanıma sunulan cihazlarda B yuvaları artık süper olmadığından BOARD_SUPER_PARTITION_SIZE için yalnızca yarı yarıya daha fazla tahta boyutuna ihtiyaç vardır. Yani BOARD_SUPER_PARTITION_SIZE, toplam(güncelleme gruplarının boyutu) + genel gider değerinden büyük veya bu değere eşit olmalıdır. Bu değer de toplam(bölümlerin boyutu) + genel gider değerinden büyük veya bu değere eşit olmalıdır.

Android 13 ve sonraki sürümlerde, Sanal A/B ile sıkıştırılmış anlık görüntüleri etkinleştirmek için aşağıdaki temel yapılandırmayı devralın:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk)

Bu sayede, işlemsiz sıkıştırma yöntemi kullanılırken sanal A/B ile kullanıcı alanı anlık görüntüleri oluşturulabilir. Daha sonra,desteklenen yöntemlerden biri olan zstd ve lz4 için sıkıştırma yöntemini yapılandırabilirsiniz. Android 15'te sıkıştırma, cihaz ihtiyaçlarına uyacak şekilde daha da özelleştirilebilir. Daha fazla bilgi için Sıkıştırmayı hassaslaştırma başlıklı makaleyi inceleyin.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Android 12 için sanal A/B ile sıkıştırılmış anlık görüntüleri etkinleştirmek üzere aşağıdaki temel yapılandırmayı devralın:

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic_ramdisk.mk)
$(call inherit-product, \
    $(SRC_TARGET_DIR)/product/virtual_ab_ota/compression.mk)

XOR sıkıştırma

Android 13 ve sonraki sürümlere yükseltilen cihazlarda XOR sıkıştırma özelliği varsayılan olarak etkin değildir. XOR sıkıştırmayı etkinleştirmek için cihazın .mk dosyasına aşağıdakileri ekleyin.

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.compression.xor.enabled=true

XOR sıkıştırması, android_t_baseline.mk'ten devralan cihazlarda varsayılan olarak etkindir.

Kullanıcı alanı birleştirme

Sanal A/B'nin modern sürümünde (Android T ve sonraki sürümler), anlık görüntü birleştirme işlemi tamamen kullanıcı alanında gerçekleşir. Bu değişiklik,Snapuserd ve dm-user ile yapılmıştır. Android 13 ve sonraki sürümlerle kullanıma sunulan cihazlarda kullanıcı alanı birleştirme varsayılan olarak etkindir. Eski cihazlarda yükseltme işlemi için bu özellik aşağıdakilerle ayarlanabilir:

PRODUCT_VENDOR_PROPERTIES += ro.virtual_ab.userspace.snapshots.enabled=true

Başlatma kontrolü HAL'si

Başlatma denetimi HAL, OTA istemcilerinin başlatma slotlarını kontrol etmesi için bir arayüz sağlar. Sanal A/B, önyükleme kontrol HAL'inde küçük bir sürüm yükseltmesi gerektirir. Bunun nedeni, önyükleme yükleyicinin yanıp sönme veya fabrika ayarlarına sıfırlama sırasında korunmasını sağlamak için ek API'lere ihtiyaç duyulmasıdır. HAL tanımının en son sürümü için IBootControl.hal ve types.hal dosyalarına bakın.

// hardware/interfaces/boot/1.1/types.hal
enum MergeStatus : uint8_t {
    NONE, UNKNOWN, SNAPSHOTTED, MERGING, CANCELLED };

// hardware/interfaces/boot/1.1/IBootControl.hal
package android.hardware.boot@1.1;
interface IBootControl extends @1.0::IBootControl {
    setSnapshotMergeStatus(MergeStatus status)
        generates (bool success);
    getSnapshotMergeStatus()
        generates (MergeStatus status);
}
// Recommended implementation

Return<bool> BootControl::setSnapshotMergeStatus(MergeStatus v) {
    // Write value to persistent storage
    // e.g. misc partition (using libbootloader_message)
    // bootloader rejects wipe when status is SNAPSHOTTED
    // or MERGING
}

Fstab değişiklikleri

Meta veri bölümünün bütünlüğü, özellikle OTA güncellemesi uygulandıktan hemen sonra, önyükleme işlemi için çok önemlidir. Bu nedenle, first_stage_init'ün bağlamadan önce meta veri bölümünün kontrol edilmesi gerekir. Bunun gerçekleşmesini sağlamak için /metadata girişine check fs_mgr işaretini ekleyin. Aşağıda bir örnek verilmiştir:

/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount,check

Çekirdek gereksinimleri

Anlık görüntü almayı etkinleştirmek için CONFIG_DM_SNAPSHOT değerini true olarak ayarlayın.

F2FS kullanan cihazlarda, dosya sabitlemeyi düzeltmek için f2fs: Export FS_NOCOW_FL flag to user çekirdek yamasını ekleyin. f2fs: support aligned pinned file çekirdek yamasını da ekleyin.

Sanal A/B, çekirdek sürüm 4.3'e eklenen özelliklere (snapshot ve snapshot-merge hedeflerindeki taşma durum biti) dayanır. Android 9 ve sonraki sürümleri çalıştıran tüm cihazlarda 4.4 veya sonraki bir çekirdek sürümü yüklü olmalıdır.

Sıkıştırılmış anlık görüntüleri etkinleştirmek için desteklenen minimum çekirdek sürümü 4.19'dur. CONFIG_DM_USER=m veya CONFIG_DM_USER=y olarak ayarlayın. İlki (modül) kullanılıyorsa modül, birinci aşama ramdisk'ine yüklenmelidir. Bu işlem, cihazın Makefile'a aşağıdaki satırı ekleyerek gerçekleştirilebilir:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Fastboot araç değişiklikleri

Android 11, fastboot protokolünde aşağıdaki değişiklikleri yapar:

  • getvar snapshot-update-status: Önyükleme denetimi HAL'inin önyükleyiciye ilettiği değeri döndürür:
    • Durum MERGING ise bootloader merging değerini döndürmelidir.
    • Durum SNAPSHOTTED ise bootloader snapshotted değerini döndürmelidir.
    • Aksi takdirde, önyükleyici none döndürmelidir.
  • snapshot-update merge — Birleştirme işlemini tamamlar ve gerekirse kurtarma/hızlı başlatma başlatma. Bu komut yalnızca snapshot-update-status merging ise geçerlidir ve yalnızca fastbootd'de desteklenir.
  • snapshot-update cancel: Başlatma kontrolü HAL'inin birleştirme durumunu CANCELLED olarak belirler. Cihaz kilitliyken bu komut geçersizdir.
  • erase veya wipe: metadata, userdata ya da başlatma kontrolü HAL'si için birleştirme durumunu barındıran bir bölüm (erase veya wipe) anlık görüntü birleştirme durumunu kontrol etmelidir. Durum MERGING veya SNAPSHOTTED ise cihaz işlemi iptal etmelidir.
  • set_active: Etkin alanı değiştiren bir set_active komutu, anlık görüntü birleştirme durumunu kontrol etmelidir. Durum MERGING ise cihaz işlemi iptal etmelidir. Yuva, SNAPSHOTTED durumundayken güvenli bir şekilde değiştirilebilir.

Bu değişiklikler, cihazların yanlışlıkla başlatılamaz hale gelmesini önlemek için tasarlanmıştır ancak otomatik araçları olumsuz etkileyebilir. Komutlar, tüm bölümlerin yanıp sönmesinin bir parçası olarak kullanıldığında (ör. fastboot flashall çalıştırma) aşağıdaki akışı kullanmanız önerilir:

  1. getvar snapshot-update-status. sorgu.
  2. merging veya snapshotted ise snapshot-update cancel sorununu gönderin.
  3. Yanıp sönme adımlarına geçin.

Depolama alanı gereksinimlerini azaltın

Süper'de tam A/B depolama alanı ayrılmamış ve gerektiğinde /data kullanması beklenen cihazların blok eşleme aracını kullanması önemle tavsiye edilir. Blok eşleme aracı, blok tahsisini derlemeler arasında tutarlı tutar ve anlık görüntüye gereksiz yazma işlemlerini azaltır. Bu konu OTA Boyutunu Azaltma bölümünde açıklanmıştır.

OTA sıkıştırma algoritmaları

OTA paketleri farklı performans metrikleri için ayarlanabilir. Android, yükleme süresi, COW alan kullanımı, önyükleme süresi ve anlık görüntü birleştirme süresi arasında değişen avantajlara sahip birkaç desteklenen sıkıştırma yöntemi (lz4, zstd ve none) sunar. Sıkıştırma içeren sanal ab için etkinleştirilen varsayılan seçenek lz4 compression method'tür.

Sıkıştırmayı hassas ayarlama

Sıkıştırma algoritmaları, iki yöntemle daha da özelleştirilebilir: (sıkıştırma düzeyi) (hız pahasına elde edilen sıkıştırma miktarı) ve (sıkıştırma faktörü) (maksimum sıkıştırılabilir pencere boyutu). Sıkıştırma seviyesi, zstd gibi belirli algoritmalar tarafından kullanılabilir. Seviyenin değiştirilmesi, hız ile sıkıştırma oranı arasında bir denge kurulmasına neden olur. Sıkıştırma faktörü, OTA yükleme sırasında kullanılan maksimum sıkıştırma aralığı boyutunu tanımlar. Varsayılan olarak 64k olarak ayarlanır ancak PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR derleme parametresi özelleştirilerek geçersiz kılınabilir. Desteklenen sıkıştırma faktörleri 4k, 8k, 16k, 32k, 64k, 128k ve 256k'tır.

PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Pixel 8 Pro'da artımlı OTA

Yükleme sonrası aşaması olmadan yükleme süresi COW Alan Kullanımı Yayın OTA başlatma süresi Anlık görüntü birleştirme süresi
lz4 18 dk. 15 sn. 2,5 GB 32,7 sn. 98,6 sn.
zstd 24 dk. 49 sn. 2,05 GB 36,3 sn 133,2 sn.
yok 16 dk. 42 sn. 4,76 GB 28,7 sn. 76,6 sn

Pixel 8 Pro'da tam OTA

Yükleme sonrası aşaması olmadan yükleme süresi COW Alan Kullanımı Yayın OTA başlatma süresi Anlık görüntü birleştirme süresi
lz4 15 dk. 11 sn. 4,16 GB 17,6 sn. 82,2 sn.
zstd 16 dk. 19 sn. 3,46 GB 21,0 sn 106,3 sn.
yok 13 dk. 33 sn. 6,39 GB 18,5 sn. 92,5 sn.