Sanal A/B'yi uygulama

Yeni bir cihazda sanal A/B'yi uygulamak veya kullanıma sunulmuş bir cihazda sonradan düzenleme 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 kullanıma sunulan 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 maliyet değerinden büyük veya bu değere eşit olmalıdır. Bu değer de toplam(bölümlerin boyutu) + genel maliyet 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. Ardından,sıkıştırma yöntemini desteklenen yöntemlerden zstd ve lz4'ten birine 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 tarafından sağlanı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

Boot control HAL

Önyükleme kontrolü HAL, OTA istemcilerinin önyükleme yuvaları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 meta veri bölümünü bağlamadan önce kontrol edilmelidir. 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. Bunu, cihaz Makefile'ine aşağıdaki satırı ekleyerek yapabilirsiniz:

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ükleme yükleyiciye ilettiği değeri döndürür:
    • Durum MERGING ise önyükleyici merging döndürmelidir.
    • Durum SNAPSHOTTED ise önyükleyici snapshotted döndürmelidir.
    • Aksi takdirde, önyükleyici none döndürmelidir.
  • snapshot-update merge: Bir birleştirme işlemini tamamlar ve gerekirse recovery/fastbootd'ye önyükleme yapar. Bu komut yalnızca snapshot-update-status merging ise geçerlidir ve yalnızca fastbootd'de desteklenir.
  • snapshot-update cancel: Açılış kontrolü HAL'inin birleştirme durumunu CANCELLED olarak belirler. Cihaz kilitliyken bu komut geçersizdir.
  • erase veya wipe: metadata, userdata veya önyükleme kontrolü HAL'i için birleştirme durumunu tutan bir bölümdeki 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 yuvayı 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 sorgusu.
  2. merging veya snapshotted ise snapshot-update cancel sorununu gönderin.
  3. Yanıp sönme adımlarına geçin.

Depolama alanı gereksinimlerini azaltma

Süper'de tam A/B depolama alanı tahsis edilmeyen ve gerektiğinde /data kullanmayı bekleyen 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 çeşitli desteklenen sıkıştırma yöntemleri (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 seviyesi) (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 algoritmalar tarafından kullanılabilir ve düzeyin değiştirilmesi, hız ile sıkıştırma oranı arasında bir denge gerektirir. 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ı OTA sonrası önyükleme 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ı OTA sonrası önyükleme 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.