Sanal A/B Uygulaması

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

Bayraklar oluşturun

Sanal A / B kullanmak Cihazlar gereken bir A / B aygıt olarak yapılandırılmış ve gereken dinamik bölümleri ile başlatacak .

Sanal A/B ile başlatılan cihazlar için, bunları sanal A/B cihaz tabanı yapılandırmasını devralacak şekilde ayarlayın:

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

Pek tahta boyutu olarak sadece yarısı sanal A / B gerek başlatılması Cihazlar BOARD_SUPER_PARTITION_SIZE B yuvaları süper artık çünkü. Kendisine, BOARD_SUPER_PARTITION_SIZE daha büyük olmalıdır ya da genel (bölmelerin boyutunu) + sırayla, daha büyük olmalıdır ki, genel toplamına (güncelleme gruplarının büyüklüğü) + eşit veya toplamına eşittir.

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

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

Önyükleme denetimi HAL

Önyükleme kontrolü HAL kontrolü önyükleme yuvalarına OTA müşterileri için bir arayüz sağlar. Sanal A/B, önyükleyicinin yanıp sönme/fabrika ayarlarına sıfırlama sırasında korunmasını sağlamak için ek API'ler gerektiğinden, önyükleme denetimi HAL'ının küçük bir sürüm yükseltmesini gerektirir. Bkz IBootControl.hal ve types.hal HAL tanımının son sürümü için.

// 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. Yani, meta bölüm önce kontrol edilmelidir first_stage_init bağlar o. Böyle sağlamak için, eklemek check için giriş fs_mgr bayrağı /metadata . Aşağıdakiler bir örnek sağlar:

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

Çekirdek gereksinimleri

Set anlık görüntü etkinleştirmek için CONFIG_DM_SNAPSHOT için true .

F2FS kullanarak cihazlar için, dahil kullanıcı için ihracat FS_NOCOW_FL bayrağı: f2fs düzeltme dosya sabitleme'ye için çekirdek yama. Dahil destek hizalanmış sabitlenmiş dosyası: f2fs çekirdek yama de.

Sanal A / B çekirdek sürümü 4.3 eklenen özelliklerin dayanır: taşma durum biti snapshot ve snapshot-merge hedefleri. Android 9 ve sonraki sürümleriyle başlatılan tüm cihazlarda zaten çekirdek sürümü 4.4 veya üstü 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. Takım CONFIG_DM_USER=m veya CONFIG_DM_USER=y . İlki (bir modül) kullanılıyorsa, modül birinci aşama ramdisk'e yüklenmelidir. Bu, Makefile cihazına aşağıdaki satırı ekleyerek başarılabilir:

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, sanal A/B ile başlatılan cihazlarla çoğunlukla aynıdır:

  • İNEK dosyalarının konumu - fırlatma cihazlar için, OTA istemci boşluk kullanmadan önce süper bölümdeki tüm mevcut boşluk kullanır /data . Güçlendirme cihazlar için, her zaman İNEK dosyası oluşturulur asla böylece süper bölümünde yeterli alan /data .

  • Yap-time özelliği bayrakları - Sanal A / B güçlendirme cihazlar için, hem PRODUCT_VIRTUAL_AB_OTA ve PRODUCT_VIRTUAL_AB_OTA_RETROFIT ayarlanır true 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 ile başlatılması Cihazları / B kesebilir BOARD_SUPER_PARTITION_SIZE B yuvaları süper bölümünde olmadığından yarısında. Sanal A güçlendirme Cihazları / B, böylece eski süper bölüm boyutunu tutmak BOARD_SUPER_PARTITION_SIZE daha büyüktür ya da 2 * toplamı (güncelleme gruplarının boyutu) için eşit sırayla daha büyük olan havai + veya 2 * toplamına eşit (bölümlerin boyutu) + tepe.

Önyükleyici değişiklikleri

Bir güncelleme birleştirme adımı sırasında, /data Android OS yalnızca tam örneğini tutmaktadır. Göç başlar, yerli kez system , vendor ve product bölümleri kopya bitinceye kadar eksiktir. Bu işlem sırasında cihaz, kurtarma yoluyla veya Sistem ayarları iletişim kutusu aracılığıyla fabrika ayarlarına sıfırlanırsa, cihaz başlatılamaz hale gelir.

Silme öncesi /data , geri kazanım veya geri alma cihazı durumuna bağlı olarak içinde birleştirme bitirmek:

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

Bootloader ve ikisi de fastbootd silebilir /data cihazı kilidi eğer bölüm. İken fastbootd tamamlamak için göç zorlayabilir, bootloader olamaz. Bootloader'larının birleştirme işlemi devam olup olmadığını bilmiyor, ya da bloklar neyi /data OS bölümleri oluşturmaktadır. Cihazlar, aşağıdakileri yaparak kullanıcının bilmeden cihazı çalışmaz hale getirmesini (tuğlalama) önlemelidir:

  1. Açılış ile değer kümesi okuyabilmesi için yükleme kontrolü HAL uygulanması setSnapshotMergeStatus() yöntemi.
  2. Birleştirme durumu ise MERGING veya birleştirme durumu ise SNAPSHOTTED ve slot yeni güncellenen yuvaya değişti, sonra temizlemek için talep userdata , metadata veya birleştirme durumunu saklamak bölüm bootloader reddedilmelidir.
  3. Uygulamak fastboot snapshot-update cancel kullanıcıların söz konusu bu koruma mekanizması baypas istediğiniz bootloader için sinyal böylece komutu.
  4. Değiştir özel konu araçları veya komut dosyalarını yanıp sönen fastboot snapshot-update cancel cihazın tamamını yanıp sönen zaman. Bu, cihazın tamamının yanıp sönmesi OTA'yı kaldıracağı için güvenlidir. İşleme uygulayarak zamanında bu komutu algılayabilen fastboot getvar snapshot-update-status . Bu komut, hata koşulları arasında ayrım yapılmasına 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 kontrolü HAL bootloader tebliğ olduğu İade değeri:
    • Devlet ise MERGING , bootloader dönmelidir merging .
    • Devlet ise SNAPSHOTTED , bootloader dönmelidir snapshotted .
    • Aksi takdirde, bootloader dönmelidir none .
  • snapshot-update merge - Tamamladı bir birleştirme operasyonu, gerekirse kurtarma / fastbootd için çizme. Bu komut halinde geçerlidir snapshot-update-status olan merging ve sadece fastbootd desteklenir.
  • snapshot-update cancel - Setler önyükleme kontrolü HAL adlı birleştirme durumunu etmek CANCELLED . Cihaz kilitliyken bu komut geçersizdir.
  • erase veya wipe An - erase veya wipe ait metadata , userdata veya anlık birleştirme durumunu kontrol etmelidir önyükleme kontrolü HAL için birleştirme durumunu tutan bir bölümü. Durum ise MERGING veya SNAPSHOTTED , cihaz işlemi iptal edilmelidir.
  • set_active - Bir set_active anlık birleştirme durumunu kontrol etmelidir aktif yuvası değiştirir komut. Durum ise MERGING , cihaz işlemi iptal edilmelidir. Yuva güvenle değiştirilebilir SNAPSHOTTED devlet.

Bu değişiklikler, bir aygıtı yanlışlıkla önyüklenemez hale getirmeyi önlemek için tasarlanmıştır, ancak otomatik araçlar için yıkıcı olabilir. Komutlar böyle çalışan gibi tüm bölümleri, yanıp sönen bir bileşeni olarak kullanıldığında fastboot flashall , aşağıdaki akışını kullanılmasını öneriyoruz:

  1. Sorgu getvar snapshot-update-status .
  2. Eğer merging veya snapshotted , konu snapshot-update cancel .
  3. Yanıp sönen adımlarla devam edin.

Depolama gereksinimlerinin azaltılması

Yok Cihazlar süper tahsis tam bir A / B depolama varsa ve kullanım bekliyoruz /data gerektiği gibi, kuvvetli blok haritalama aracı kullanmak için tavsiye edilir. Blok eşleme aracı, yapılar arasında blok ayırmayı tutarlı tutar ve anlık görüntüye gereksiz yazmaları azaltır. Bu altında belgelenmiştir OTA Boyutu azaltılması .