Sanal A/B'yi uygulama

Yeni bir cihazda sanal A/B testi uygulamak veya kullanıma sunulmuş bir cihazı uyarlamak için cihaza özel kodda değişiklik yapmanız gerekir.

İşaret oluşturma

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

Sanal A/B ile kullanıma sunulan cihazları, sanal A/B cihaz taban 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üperde olmadığından BOARD_SUPER_PARTITION_SIZE için yalnızca yarı yarıya daha az kart boyutu gerekir. Yani BOARD_SUPER_PARTITION_SIZE, sum(size of update groups) + overhead değerine eşit veya bu değerden büyük olmalıdır. Bu değer de sum(size of partitions) + overhead değerine eşit veya bu değerden büyük 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, no-op sıkıştırma yöntemi kullanılırken Virtual A/B ile kullanıcı alanı anlık görüntülerinin alınmasını sağlar. Ardından,sıkıştırma yöntemini desteklenen yöntemlerden biri olan zstd ve lz4 olarak 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ı ince ayarlama başlıklı makaleyi inceleyin.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4
PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536

Android 12'de, Virtual 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/compression.mk)

XOR sıkıştırması

Android 13 ve sonraki sürümlere yükseltilen cihazlarda XOR sıkıştırma özelliği varsayılan olarak etkinleştirilmez. 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ırma, android_t_baseline.mk öğesinden 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 sayesinde mümkün olmaktadır. Android 13 ve sonraki sürümlerle kullanıma sunulan cihazlarda kullanıcı alanı birleştirme özelliği varsayılan olarak etkindir. Daha eski cihazlarda ise bu özellik, yükseltme sırasında aşağıdaki yöntemlerle ayarlanabilir:

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

Başlatma kontrolü HAL'si

Önyükleme kontrolü HAL, OTA istemcilerinin önyükleme yuvalarını kontrol etmesi için bir arayüz sağlar. Virtual A/B, önyükleyici yazılımının yanıp sönme veya fabrika ayarlarına sıfırlama sırasında korunmasını sağlamak için ek API'ler gerektiğinden önyükleme denetimi HAL'inin küçük sürüm yükseltmesini gerektirir. 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 bir OTA güncellemesi uygulandıktan hemen sonra başlatma işlemi için çok önemlidir. Bu nedenle, first_stage_init bağlamadan önce meta veri bölümü kontrol edilmelidir. Bunun gerçekleşmesini sağlamak için check fs_mgr işaretini /metadata girişine 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'te eklenen özelliklerden yararlanır: snapshot ve snapshot-merge hedeflerindeki overflow durum biti. Android 9 ve sonraki sürümlerle kullanıma sunulan tüm cihazlarda çekirdek sürümü 4.4 veya sonraki bir 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. Önceki yöntemi (modül) kullanıyorsanız modül, ilk aşama ramdisk'te yüklenmelidir. Bu, cihazın Makefile dosyasına aşağıdaki satır eklenerek yapılabilir:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Fastboot araçlarında yapılan değişiklikler

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

  • getvar snapshot-update-status: Önyükleme denetimi HAL'sinin ö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, bootloader none değerini döndürmelidir.
  • snapshot-update merge: Birleştirme işlemini tamamlar ve gerekirse kurtarma/fastbootd modunda başlatır. Bu komut yalnızca snapshot-update-status merging ise geçerlidir ve yalnızca fastbootd'de desteklenir.
  • snapshot-update cancel: Önyükleme kontrolü HAL'inin birleştirme durumunu CANCELLED olarak ayarlar. Bu komut, cihaz kilitliyken geçersizdir.
  • erase veya wipe: metadata, userdata veya erase ya da wipe birleştirme durumunu içeren bir bölüm, anlık görüntü birleştirme durumunu kontrol etmelidir. Durum MERGING veya SNAPSHOTTED ise cihaz işlemi iptal etmelidir.
  • set_active: Etkin yuvanın değiştirildiği bir set_active komutu, anlık görüntü birleştirme durumunu kontrol etmelidir. Durum MERGING ise cihaz işlemi iptal etmelidir. Yuva, SNAPSHOTTED durumunda güvenli bir şekilde değiştirilebilir.

Bu değişiklikler, cihazın yanlışlıkla başlatılamaz hale gelmesini önlemek için tasarlanmıştır ancak otomatik araçları aksatabilir. Komutlar, fastboot flashall komutunu çalıştırmak gibi tüm bölümleri flaşlamanın bir bileşeni olarak kullanıldığında aşağıdaki akışın kullanılması önerilir:

  1. Sorgu getvar snapshot-update-status.
  2. merging veya snapshotted ise snapshot-update cancel sorununu giderin.
  3. Flaşlama adımlarıyla devam edin.

Depolama alanı gereksinimlerini azaltma

Süperde tam A/B depolama alanı ayrılmamış ve gerektiğinde /data kullanmayı bekleyen cihazların blok eşleme aracını kullanması önemle tavsiye edilir. Blok eşleme aracı, blok ayırmayı derlemeler arasında tutarlı tutarak anlık görüntüye gereksiz yazma işlemlerini azaltır. Bu durum, OTA Boyutunu Küçültme bölümünde belgelenmiştir.

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 denge sağlayan çeşitli desteklenen sıkıştırma yöntemleri (lz4, zstd ve none) sunar. Sıkıştırma ile sanal ab için varsayılan olarak etkinleştirilen seçenek lz4 compression method'dır.

Sıkıştırmada ince ayar

Sıkıştırma algoritmaları iki yöntemle daha fazla ö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 düzeyi, zstd gibi belirli algoritmalarda kullanılabilir ve düzeyi değiştirmek hız ile sıkıştırma oranı arasında bir denge kurmayı gerektirir. Sıkıştırma faktörü, OTA yüklemesi sırasında kullanılan maksimum sıkıştırma penceresi boyutunu açıklar. Varsayılan değer 64k olarak ayarlanır ancak PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR derleme parametresi özelleştirilerek geçersiz kılınabilir. 4k, 8k, 16k, 32k, 64k, 128k ve 256k sıkıştırma faktörleri desteklenir.

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ı OTA sonrası önyükleme süresi Anlık görüntü birleştirme zamanı
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ı OTA sonrası önyükleme süresi Anlık görüntü birleştirme zamanı
lz4 15 dk. 11 sn. 4,16 GB 17,6 sn 82,2 sn.
zstd 16 dakika 19 saniye 3,46 GB 21,0 sn. 106,3 sn.
yok 13 dk 33 sn 6,39 GB 18,5 sn. 92,5 sn