Sanal A/B'yi uygulayın

Yeni bir cihaza sanal A/B uygulamak veya kullanıma sunulan bir cihazda geriye dönük düzenleme yapmak için cihaza özel kodda değişiklik yapması gerekir.

Derleme işaretleri

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

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

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

Sanal A/B ile kullanıma sunulan cihazların, sanal A/B'nin B alanları artık "süper"de olmadığı için BOARD_SUPER_PARTITION_SIZE. Yani, BOARD_SUPER_PARTITION_SIZE, en az olmalıdır sum(güncelleme gruplarının boyutu) + genel gider, bu da daha büyük olmalıdır. topla(bölümlerin boyutu) + ek yük değerine eşit veya bu değerden küçük olmalıdır.

Android 13 ve sonraki sürümlerde sıkıştırmayı etkinleştirmek için anlık görüntüler için aşağıdaki temel yapılandırmayı devralır:

$(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şlemsiz bir işlem kullanırken sanal A/B ile kullanıcı alanı anlık görüntülerine olanak tanır yöntemidir. Ardından, sıkıştırma yöntemini ayarlayarak desteklenen yöntemler, gz, zstd ve lz4.

PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4

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

$(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 geçen cihazlarda XOR sıkıştırma özelliği varsayılan olarak etkindir. XOR sıkıştırmayı etkinleştirmek için aşağıdakileri cihazın .mk dosyası yükleyin.

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

Şunlardan devralan cihazlar için ÖZELVEYA sıkıştırması varsayılan olarak etkindir: android_t_baseline.mk

Kullanıcı alanı birleştirme

Android 13 ve sonraki sürümlere geçen cihazlarda Cihaz eşleştirici bölümünde açıklandığı gibi kullanıcı alanı birleştirme işlemi katman oluşturma varsayılandır. Kullanıcı alanı birleştirmeyi etkinleştirmek için aşağıdaki satırı cihazın .mk bölümüne ekleyin dosya:

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

Kullanıcı alanı birleştirme, 13 ve üzeri.

Başlatma kontrolü HAL'si

Başlatma kontrolü HAL OTA istemcilerinin önyükleme alanlarını kontrol etmesi için bir arayüz sağlar. Sanal A/B ek API'ler nedeniyle önyükleme denetimi HAL'sinin küçük bir sürümünün yükseltilmesini gerektirir yanıp sönme veya fabrika ayarlarına sıfırlama sırasında bootloader'ın korunduğundan emin olmak için gereklidir. Görüntüleyin IBootControl.hal ve types.hal sayfası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üğü, başlatma işlemi için çok önemlidir. Özellikle bir OTA güncellemesi uygulandıktan hemen sonra. Bu nedenle, meta veri bölümünün first_stage_init tarafından monte edilmeden önce kontrol edilmelidir. Bunun olmasını sağlamak için /metadata girişine fs_mgr flag'i check. Aşağıdaki özellikler, örnek:

/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 cihazlar için f2fs: Export FS_NOCOW_FL flag'ini şuraya ekleyin: user çekirdek yamasını düzeltmesine yardımcı olur. f2fs: destek uyumlu sabitlenmiş dosyası çekirdek düzeltmesini de devre dışı bırakabilirsiniz.

Sanal A/B, çekirdek 4.3 sürümünde eklenen özelliklere dayanır: overflow durum bitini snapshot ve snapshot-merge hedeflerinde gösterir. Tüm cihazlar başlatılıyor .

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. Birincisini (modül) kullanıyorsanız modülün birinci aşama ramdisk'e yüklenmesi gerekir. Bunu başarmak için ise şu satırı cihazın Makefile'a ekleyerek:

BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko

Android 11'e geçen cihazlarda yenileme

Android 11'e yükseltildiğinde, dinamik bölümlerle kullanıma sunulan cihazlar isteğe bağlı olarak sanal A/B'de geriye dönük ayarlamalar yapabilirsiniz. Güncelleme işlemi genel olarak Sanal A/B ile başlatılan cihazlar (bazı küçük farklılıklar):

  • COW dosyalarının konumu: OTA istemcisi, başlatma cihazları için süper bölümlendirmede alan kullanmadan önce /data. Geliştirme amaçlı cihazlarda, süper güçte her zaman yeterli alan bölümünü kullanarak COW dosyası hiçbir zaman /data üzerinde oluşturulmaz.

  • Derleme zamanı özellik işaretleri: Sanal A/B'yi destekleyen cihazlar için hem PRODUCT_VIRTUAL_AB_OTA hem de PRODUCT_VIRTUAL_AB_OTA_RETROFIT ayarlandı true adlı alıcıya aşağıda gösterildiği gibi:

    (call inherit-product, \
      (SRC_TARGET_DIR)/product/virtual_ab_ota_retrofit.mk)
    
  • Süper bölüm boyutu: Sanal A/B ile başlatılan cihazlar kesilebilir. B alanları süper'de olmadığı için BOARD_SUPER_PARTITION_SIZE yarıda bölüm. Sanal A/B'yi güçlendiren cihazlar eski süper bölümü korur yani BOARD_SUPER_PARTITION_SIZE, 2 * toplam(güncelleme gruplarının boyutu) + genel gider, bu da 2 * toplam(bölüm boyutu) + ek yük.

Bootloader değişiklikleri

Bir güncellemenin birleştirme adımı sırasında /data, Android OS. Taşıma işlemi başladığında system, vendor ve Kopyalama işlemi tamamlanana kadar product bölümleri tamamlanmayacak. Cihaz kurtarma veya Sistemler aracılığıyla fabrika ayarlarına sıfırlama işlemi cihaz yeniden başlatılamaz.

/data öğesini silmeden önce, şuna bağlı olarak kurtarma veya geri alma işleminde birleştirme işlemini tamamlayın: cihaz durumu:

  • Yeni derleme daha önce başarıyla başlatıldıysa taşıma işlemini tamamlayın.
  • Aksi takdirde, eski alana geri dönün:
    • Dinamik bölümler için önceki duruma geri dönün.
    • Statik bölümler için etkin alanı eski yuvaya ayarlayın.

Bootloader ve fastbootd, aşağıdaki durumlarda /data bölümünü silebilir cihazın kilidi açıldığından. fastbootd, taşıma işlemini tamamlanmaya zorlayabilir ancak işlemi gerçekleştiremez. Bootloader, bir birleştirme işleminin tamamlanıp tamamlanmadığını /data ürününde hangi blokların OS bölümlerini oluşturduğunu görebilirsiniz. Cihazlar kullanıcıyı tanımadan cihazı çalışır duruma getirmesini (tuğlamasını) şunları yapabilirsiniz:

  1. Bootloader'ın ayarlanan değeri okuyabilmesi için başlatma kontrolü HAL'sini uygulayın setSnapshotMergeStatus() yöntemiyle gerçekleştirebilirsiniz.
  2. Birleştirme durumu MERGING ise veya birleştirme durumu SNAPSHOTTED ise ve alan yeni güncellenen alanla değiştikten sonra silme isteğinde bulunur. userdata, metadata veya birleştirme durumunu saklayan bölüm: reddedildi.
  3. Kullanıcıların şu işlemleri yapabilmesi için fastboot snapshot-update cancel komutunu uygulayın: Bootloader'a bu koruma mekanizmasını atlamak istediklerini bildirir.
  4. Tüm cihaz yanıp sönerken fastboot snapshot-update cancel hatası vermek için özel yanıp sönen araçları veya komut dosyalarını değiştirin. Bu işlem güvenlidir, çünkü cihazın tamamen yanıp sönmesi OTA'yı kaldırır. Araç bu komutu algılayabilir fastboot getvar snapshot-update-status uygulayarak çalışma zamanında istenen performansı artırın. Bu komutu, hata koşullarının birbirinden ayırt edilmesine 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 aracı değişiklikleri

Android 11, fastboot'ta aşağıdaki değişiklikleri yapıyor protokol:

  • getvar snapshot-update-status — Önyüklemenin değerini döndürür Bootloader'a iletilen HAL kontrolü:
    • 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/hızlı başlatma. Bu komut yalnızca snapshot-update-status, merging şeklindedir ve yalnızca fastbootd'da desteklenir.
  • snapshot-update cancel — Başlatma denetimi HAL'sinin birleştirme durumunu şu şekilde ayarlar: CANCELLED. Cihaz kilitliyken bu komut geçersiz olur.
  • erase veya wipeerase veya wipe/metadata, userdata veya HAL'nin kontrol etmesi gereken başlatma denetimi için birleştirme durumunu barındıran bir bölüm anlık görüntü birleştirme durumunu gösterir. Durum MERGING veya SNAPSHOTTED ise cihazın işlemi iptal etmesi gerekir.
  • set_active — Etkin zaman aralığını değiştiren bir set_active komutu anlık görüntü birleştirme durumunu kontrol etmesi gerekir. Durum MERGING ise cihazın işlemi iptal etmesi gerekir. Yuva, SNAPSHOTTED durumu.

Bu değişiklikler, cihazın yanlışlıkla başlatılamaz duruma gelmesini önlemek için tasarlanmıştır. ancak otomatik araçları aksatabilirler. Komutlar tüm bölümlerin yanıp sönen bileşeni (fastboot flashall çalıştırmak gibi) şu akışı kullanmanız önerilir:

  1. getvar snapshot-update-status. sorgu.
  2. merging veya snapshotted ise snapshot-update cancel.
  3. Yanıp sönen adımlarla devam edin.
ziyaret edin.

Depolama alanı gereksinimlerini azaltın

"Süper" olarak ayrılmış tam A/B depolama alanına sahip olmayan ve beklenen cihazlar /data kullanmak için blok eşlemenin kullanılması önemle tavsiye edilir aracını kullanın. Blok eşleme aracı, blok ayırmanın derlemeler arasında tutarlı olmasını sağlar. anlık görüntüye gereksiz yazma işlemlerini azaltır. Bu konu, Azaltma OTA Boyutu.

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

OTA paketleri, farklı performans metrikleri için ayarlanabilir. Android, desteklenen çeşitli sıkıştırma yöntemleri (gz, lz4, zstd ve none) yükleme süresi, COW alanı kullanımı, başlatma süresi ve anlık görüntü arasında denge vardır. birleştirme zamanı. Sıkıştırılmış 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 CPU hızına ve depolama alanı işleme hızına bağlı olarak değişebilir. cihaz üzerinde. Aşağıda oluşturulan tüm OTA paketlerinde PostYüklemeler devre dışıdır. açılış süresini biraz yavaşlatır. Bir deponun toplam dinamik bölüm boyutu sıkıştırmasız tam ota'nın değeri 4,81 GB'tır).

Pixel 6 Pro'da artımlı OTA

Yükleme sonrası aşama olmadan yükleme süresi COW alan kullanımı Yayın OTA başlatma süresi Anlık görüntü birleştirme zamanı
gz 24 dk. 1,18 GB 40,2 sn 45,5 sn
lz4 13 dk. 1,49 GB 37,4 sn 37,1 sn
yok 13 dk. 2,90 GB 37,6 sn 40,7 sn

Pixel 6 Pro'da tam OSA

Yükleme sonrası aşama olmadan yükleme süresi COW Alan Kullanımı Yayın OTA başlatma süresi Anlık görüntü birleştirme zamanı
gz 23 dk. 2,79 GB 24,9 sn 41,7 sn
lz4 12 dk. 3,46 GB 20,0 sn 25,3 sn
yok 10 dk. 4,85 GB 20,6 sn 29,8 sn