Sanal A/B'yi uygulayın

Sanal A/B'yi yeni bir cihaza uygulamak veya başlatılan bir cihazı yenilemek için cihaza özel kodda değişiklikler yapmanız gerekir.

Bayraklar oluşturun

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

Sanal A/B ile başlatılan cihazlar için, bunları 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 başlayan aygıtlar, BOARD_SUPER_PARTITION_SIZE için yalnızca yarısı kadar pano boyutuna ihtiyaç duyar çünkü B yuvaları artık süper değildir. Diğer bir deyişle, BOARD_SUPER_PARTITION_SIZE , sum(size of update group) + ek yükten büyük veya eşit olmalıdır; bu da, sırasıyla sum(size of partitions) + ek yükten büyük veya eşit olmalıdır.

Android 13 ve üzeri 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/android_t_baseline.mk)

Bu, işlem gerektirmeyen bir sıkıştırma yöntemi kullanırken Sanal A/B ile kullanıcı alanı anlık görüntülerini etkinleştirir. Daha sonra sıkıştırma yöntemini desteklenen yöntemlerden biri olan gz ve brotli olarak yapılandırabilirsiniz.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := gz

Android 12 için Virtual 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ırması

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

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

XOR sıkıştırması, android_t_baseline.mk öğesinden devralan aygıtlar için varsayılan olarak etkindir.

Kullanıcı alanı birleştirme

Android 13 ve sonraki sürümlere yükseltme yapan cihazlarda, Cihaz eşleyici katmanlama bölümünde açıklanan kullanıcı alanı birleştirme işlemi varsayılan olarak etkin değildir. Kullanıcı alanı birleştirmeyi etkinleştirmek için, cihazın .mk dosyasına aşağıdaki satırı ekleyin:

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

Kullanıcı alanı birleştirme, 13 ve üzeri sürümlerle başlayan cihazlarda varsayılan olarak etkindir.

Önyükleme denetimi HAL

Önyükleme denetimi HAL, OTA istemcilerinin önyükleme yuvalarını denetlemesi için bir arabirim sağlar. Sanal A/B, önyükleme denetimi HAL'ının küçük bir sürüm yükseltmesini gerektirir çünkü yanıp sönme/fabrika ayarlarına sıfırlama sırasında önyükleyicinin korunmasını sağlamak için ek API'ler gerekir. HAL tanımının en son sürümü için IBootControl.hal ve type.hal'a 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, önyükleme işlemi için çok önemlidir. Bu nedenle, meta veri bölümü, first_stage_init onu bağlamadan önce kontrol edilmelidir. Bunun olmasını sağlamak için, girişe fs_mgr işaretini check edin /metadata . Aşağıdaki örnek bir örnek sağlar:

/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 true olarak ayarlayın.

F2FS kullanan aygıtlar için, dosya sabitlemeyi düzeltmek için f2fs: export FS_NOCOW_FL bayrağını kullanıcı çekirdeği yamasına ekleyin. F2fs: Hizalanmış sabitlenmiş dosya çekirdeği yamasını da destekleyin .

Sanal A/B, çekirdek sürüm 4.3'te eklenen özelliklere dayanır: snapshot taşma durumu biti ve snapshot-merge hedefleri. Android 9 ve sonraki sürümlerle başlayan tüm cihazlarda çekirdek sürümü 4.4 veya sonraki sürümlere sahip 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 ayarlayın. İlki (bir modül) kullanılıyorsa, modül birinci aşama ramdisk'e yüklenmelidir. Bu, Makefile aygıtına aşağıdaki satırı ekleyerek elde edilebilir:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Android 11'e yükseltilen cihazlarda güçlendirme

Android 11'e yükseltirken, dinamik bölümlerle başlatılan cihazlar isteğe bağlı olarak sanal A/B'yi güçlendirebilir. Güncelleme işlemi, bazı küçük farklılıklar dışında, çoğunlukla sanal A/B ile başlatılan cihazlarla aynıdır:

  • COW dosyalarının konumu — Başlatma aygıtları için, OTA istemcisi /data içindeki alanı kullanmadan önce süper bölümdeki tüm kullanılabilir boş alanı kullanır. Güçlendirme aygıtları için, süper bölümde her zaman yeterli alan vardır, böylece COW dosyası hiçbir zaman /data üzerinde oluşturulmaz.

  • Yapı zamanı özellik bayrakları — Sanal A/B'yi güçlendiren cihazlar için, aşağıda gösterildiği gibi hem PRODUCT_VIRTUAL_AB_OTA hem de PRODUCT_VIRTUAL_AB_OTA_RETROFIT true olarak ayarlanmıştır:

    (call inherit-product, \
        (SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
    
  • Süper bölüm boyutu — Sanal A/B ile başlayan aygıtlar, BOARD_SUPER_PARTITION_SIZE yarıya indirebilir çünkü B yuvaları süper bölümde değildir. Sanal A/B'yi güçlendiren aygıtlar eski süper bölüm boyutunu korur, bu nedenle BOARD_SUPER_PARTITION_SIZE 2 * sum(size of update group) + ek yükten büyük veya eşittir ve bu da 2 * sum(size of partitions) değerinden büyük veya eşittir + ek yük .

Önyükleyici değişiklikleri

Bir güncellemenin birleştirme adımı sırasında /data , Android işletim sisteminin tek tam örneğini tutar. Geçiş başladığında, yerel system , vendor ve product bölümleri, kopyalama tamamlanana kadar eksik kalır. Cihaz bu işlem sırasında kurtarma veya Sistem ayarları iletişim kutusu yoluyla fabrika ayarlarına sıfırlanırsa, cihaz yeniden başlatılamaz.

/data öğesini silmeden önce, cihazın durumuna bağlı olarak kurtarma veya geri alma sırasında birleştirmeyi bitirin:

  • Yeni yapı daha önce başarıyla önyüklendiyse geçişi tamamlayın.
  • Aksi takdirde, eski yuvaya geri alma:
    • Dinamik bölümler için önceki duruma geri dönün.
    • Statik bölümler için, aktif yuvayı eski yuvaya ayarlayın.

Cihazın kilidi açılmışsa, hem önyükleyici hem de fastbootd /data bölümünü silebilir. fastbootd taşıma işlemini tamamlamaya zorlayabilirken önyükleyici bunu yapamaz. Önyükleyici, bir birleştirmenin devam edip etmediğini veya /data hangi blokların işletim sistemi bölümlerini oluşturduğunu bilmez. Cihazlar, kullanıcının aşağıdakileri yaparak cihazı bilmeden cihazı çalışmaz hale getirmesini (tuğlalama) önlemelidir:

  1. Önyükleyicinin setSnapshotMergeStatus() yöntemi tarafından ayarlanan değeri okuyabilmesi için önyükleme denetimi HAL'ını uygulayın.
  2. Birleştirme durumu MERGING ise veya birleştirme durumu SNAPSHOTTED ise ve yuva yeni güncellenen yuva olarak değiştiyse, userdata , metadata veya birleştirme durumunu depolayan bölümü silme istekleri önyükleyicide reddedilmelidir.
  3. fastboot snapshot-update cancel komutunu uygulayın, böylece kullanıcılar önyükleyiciye bu koruma mekanizmasını atlamak istediklerini bildirebilirler.
  4. Tüm cihazın yanıp sönmesi sırasında fastboot snapshot-update cancel vermek için özel yanıp sönme araçlarını veya komut dosyalarını değiştirin. Tüm cihazın yanıp sönmesi OTA'yı kaldırdığı için bunu yapmak güvenlidir. Tooling, bu komutu çalışma zamanında fastboot getvar snapshot-update-status uygulayarak algılayabilir. Bu komut, hata koşulları arasında ayrım yapmaya yardımcı olur.

Örnek

struct VirtualAbState {
    uint8_t StructVersion;
    uint8_t MergeStatus;
    uint8_t SourceSlot;
};

bool ShouldPreventUserdataWipe() {
    VirtualAbState state;
    if (!ReadVirtualAbState(&state)) ...
    return state.MergeStatus == MergeStatus::MERGING ||
           (state.MergeStatus == MergeStatus::SNAPSHOTTED &&
            state.SourceSlot != CurrentSlot()));
}

Fastboot takım değişiklikleri

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

  • getvar snapshot-update-status — Önyükleme denetimi HAL'nin önyükleyiciye ilettiği değeri döndürür:
    • Durum MERGING ise, önyükleyicinin merging döndürmesi gerekir.
    • Durum SNAPSHOTTED ise, önyükleyici snapshotted dönmelidir.
    • Aksi takdirde, önyükleyicinin none döndürmesi gerekir.
  • snapshot-update merge — Bir birleştirme işlemini tamamlar, gerekirse kurtarma/hızlı başlatmaya önyükleme yapar. Bu komut yalnızca snapshot-update-status merging geçerlidir ve yalnızca fastbootd'da desteklenir.
  • snapshot-update cancel — Önyükleme denetimi HAL'nin birleştirme durumunu CANCELLED olarak ayarlar. Cihaz kilitliyken bu komut geçersizdir.
  • erase veya wipemetadata , userdata veya önyükleme kontrolü HAL için birleştirme durumunu tutan bir bölümün 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 durumunda güvenle değiştirilebilir.

Bu değişiklikler, yanlışlıkla bir aygıtı önyüklenemez hale getirmeyi önlemek için tasarlanmıştır, ancak otomatikleştirilmiş araçları bozabilirler. Komutlar fastboot flashall çalıştırmak gibi tüm bölümleri yanıp sönmenin bir bileşeni olarak kullanıldığında, aşağıdaki akışın kullanılması önerilir:

  1. getvar snapshot-update-status sorgusu.
  2. merging veya snapshotted durumunda, snapshot-update cancel yayınlayın.
  3. Yanıp sönen adımlarla devam edin.

Depolama gereksinimlerini azaltın

Süper olarak ayrılmış tam A/B depolama alanına sahip olmayan ve /data gerektiği gibi kullanmayı bekleyen cihazların blok eşleme aracını kullanmaları şiddetle tavsiye edilir. Blok eşleme aracı, yapılar arasında blok tahsisinin tutarlı olmasını sağlayarak anlık görüntüye gereksiz yazma işlemlerini azaltır. Bu , OTA Boyutunu Küçültme altında belgelenmiştir.

OTA sıkıştırma yöntemleri

Ota paketleri, farklı performans ölçümleri için ayarlanabilir. Android şu anda 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ş tokuş yapan birkaç desteklenen sıkıştırma yöntemi ( gz , lz4 ve none ) sağlamaktadır. Sıkıştırmalı sanal ab için etkinleştirilen varsayılan seçenek gz compression method . (Not: Sıkıştırma yöntemleri arasındaki göreli performans, cihaza bağlı olarak değişebilen CPU hızına ve depolama verimine bağlı olarak değişir. Aşağıda oluşturulan tüm OTA paketleri, önyükleme süresini biraz yavaşlatacak olan PostInstall devre dışıdır. Tam bir ota'nın toplam dinamik bölüm boyutu sıkıştırma olmadan 4.81 GB ).

Pixel 6 Pro'da Artımlı OTA

Yükleme sonrası aşaması olmadan yükleme süresi İNEK alan kullanımı OTA önyükleme süresi sonrası Anlık görüntü birleştirme zamanı
gz 24 dakika 1,18 GB 40.2 saniye 45.5 saniye
lz4 13 dakika 1,49 GB 37.4 saniye 37.1 saniye
hiçbiri 13 dakika 2,90 GB 37.6 saniye 40.7 saniye

Pixel 6 Pro'da Tam OTA

Yükleme sonrası aşaması olmadan yükleme süresi İNEK Alanı Kullanımı OTA önyükleme süresi sonrası Anlık görüntü birleştirme zamanı
gz 23 dakika 2,79 GB 24.9 saniye 41.7 saniye
lz4 12 dakika 3,46 GB 20.0 saniye 25.3 saniye
hiçbiri 10 dk 4,85 GB 20.6 saniye 29.8 saniye