A/B güncellemelerini uygulama

A/B sistem güncellemelerini uygulamak isteyen OEM'ler ve SoC tedarikçileri, bootloader'larının sağlandığından emin olmalıdır. boot_control HAL'yi uygular ve doğru parametreleri, Search Ads 360'a kernel'e gidin.

Başlatma denetimi HAL'sini uygulama

A/B özellikli bootloader'lar boot_control HAL'yi şurada uygulamalıdır: hardware/libhardware/include/hardware/boot_control.h. Uygulamaları kontrol etmek için system/extras/bootctl. ve system/extras/tests/bootloader/.

Aşağıda gösterilen durum makinesini de uygulamanız gerekir:

.
Şekil 1. Bootloader durumu makinesi

Çekirdek oluşturma

A/B sistem güncellemelerini uygulamak için:

  1. Aşağıdaki çekirdek yaması serisini Cherrypick'leyin (gerekirse):
  2. Çekirdek komut satırı bağımsız değişkenlerinin aşağıdaki ekstra bağımsız değişkenleri içerdiğinden emin olun:
    skip_initramfs rootwait ro init=/init root="/dev/dm-0 dm=system none ro,0 1 android-verity <public-key-id> <path-to-system-partition>"
    ... <public-key-id> değeri, bu işlem için kullanılan ortak anahtarın kimliğidir. doğrulama tablosu imzasını doğrulayın (ayrıntılar için bkz. dm-verity) girin.
  3. Ortak anahtarı içeren .X509 sertifikasını sistem anahtarlığına ekleyin:
    1. .der biçiminde biçimlendirilmiş .X509 sertifikasını kernel dizini. .X509 sertifikası .pem dosyası için aşağıdaki openssl komutunu kullanın: .pem - .der biçimi:
      openssl x509 -in <x509-pem-certificate> -outform der -out <x509-der-certificate>
    2. Sertifikayı sistem anahtarlığının bir parçası olarak içerecek şekilde zImage oluşturun. Doğrulamak için procfs girişini kontrol edin ( KEYS_CONFIG_DEBUG_PROC_KEYS etkinleştirilecek):
      angler:/# cat /proc/keys
      
      1c8a217e I------     1 perm 1f010000     0     0 asymmetri
      Android: 7e4333f9bba00adfe0ede979e28ed1920492b40f: X509.RSA 0492b40f []
      2d454e3e I------     1 perm 1f030000     0     0 keyring
      .system_keyring: 1/4
      .X509 sertifikasının başarıyla eklenmesi, ortak anahtarın bulunduğunu gösterir eklemesi gerekir (vurgu, ortak anahtar kimliğini belirtir).
    3. Alanı # ile değiştir ve şu şekilde ilet: <public-key-id> değerini ekleyin. Örneğin, Android:#7e4333f9bba00adfe0ede979e28ed1920492b40f <public-key-id>.

Derleme değişkenlerini ayarlama

A/B özellikli bootloader'lar aşağıdaki derleme değişkeni ölçütlerini karşılamalıdır:

A/B hedefi için tanımlanmalıdır
  • AB_OTA_UPDATER := true

  • AB_OTA_PARTITIONS := \
      boot \
      system \   vendor
    ve diğer bölümler update_engine üzerinden güncellenen (radyo, bootloader, etc.)
  • PRODUCT_PACKAGES += \
      update_engine \
      update_verifier
ziyaret edin. Örneğin, /device/google/marlin/+/android-7.1.0_r1/device-common.mk. İsteğe bağlı olarak, şurada açıklanan yükleme sonrası (ancak yeniden başlatma öncesi) dex2oat adımını uygulayabilirsiniz: Derleniyor.
A/B hedefi için önemle tavsiye edilir
  • TARGET_NO_RECOVERY := true kelimesinin tanımı
  • BOARD_USES_RECOVERY_AS_BOOT := true kelimesinin tanımı
  • BOARD_RECOVERYIMAGE_PARTITION_SIZE öğesini tanımlama
A/B hedefi için tanımlanamıyor
  • BOARD_CACHEIMAGE_PARTITION_SIZE
  • BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE
Hata ayıklama derlemeleri için isteğe bağlı PRODUCT_PACKAGES_DEBUG += update_engine_client

Bölümleri (alanlar) ayarlama

Android artık A/B cihazlarını kullanmadığından A/B cihazlarında kurtarma bölümü veya önbellek bölümü gerekmez yardımcı olabilir. Veri bölümü artık indirilen OTA paketi için kullanılır ve kurtarma görüntüsü kodu başlatma bölümündedir. A/B-ed olan tüm bölümler adlandırılmalıdır aşağıdaki gibidir (alanlar her zaman a, b vb. olarak adlandırılır): boot_a, boot_b, system_a, system_b, vendor_a, vendor_b.

Önbellek

A/B olmayan güncellemelerde önbellek bölümü, indirilen OTA paketlerini depolamak ve Güncellemeleri uygularken engellemeleri geçici olarak saklayın. Önbelleği boyutlandırmanın iyi bir yolu yoktu bölüm: hangi güncellemeleri uygulamak istediğinize bağlı olması gereken boyut. En kötü sistem görüntüsü kadar büyük bir önbellek bölümü olacaktır. A/B güncellemeleriyle gerek yok (çünkü her zaman o anda kullanılmayan bir bölüme yazarsınız) ve A/B akışıyla, uygulamadan önce tüm OTA paketini indirmenize gerek yoktur.

Kurtarma

Kurtarma RAM diski artık boot.img dosyasında yer alıyor. Bu nedenle, bootloader, skip_initramfs seçeneğini etkinleştiremez ekleyebilirsiniz.

A/B olmayan güncellemelerde kurtarma bölümü, güncellemeleri uygulamak için kullanılan kodu içerir. A/B güncellemeler, normal başlatılan sistem görüntüsünde çalışan update_engine tarafından uygulanır. Fabrika verilerine sıfırlama işlemi ve güncellemeleri başka cihazdan yüklemek için kullanılan bir kurtarma modu hâlâ vardır. ("kurtarma" adının geldiği yer). Kurtarma moduna ilişkin kod ve veriler bir RAM'deki normal başlatma bölümünde saklanır; başlatılması için bootloader, çekirdeğe ramdisk'i atlamasını söyler (aksi takdirde cihaz kurtarma işlemini başlatır) yatırım yapmanız önemlidir. Kurtarma modu küçüktür (ve bunların büyük bir kısmı başlatma bölümündedir), bu nedenle bölüm boyutu artmaz.

Fstab

slotselect bağımsız değişkeni, A/B-ed parametresi için olmalıdır. her bölüm için geçerlidir. Örnek:

<path-to-block-device>/vendor  /vendor  ext4  ro
wait,verify=<path-to-block-device>/metadata,slotselect

Hiçbir bölüm vendor olarak adlandırılmamalıdır. Bunun yerine, bölüm vendor_a veya vendor_b seçilip /vendor ekleme noktasına eklenecek.

Çekirdek yuvası bağımsız değişkenleri

Geçerli alan son eki, belirli bir cihaz ağacı (DT) düğümünden iletilmelidir (/firmware/android/slot_suffix) veya androidboot.slot_suffix çekirdek komut satırı veya bootconfig bağımsız değişkeni.

Varsayılan olarak, fastboot özelliği bir A/B cihazındaki geçerli yuvayı yanıp söner. Güncelleme paketi diğer güncel olmayan alan için resimleri içeriyorsa, fastboot bu resimleri de yanıp söndürür. Kullanılabilir seçenekler şunlardır:

  • --slot SLOT. Varsayılan davranışı geçersiz kıl ve fastboot komutunu, tartışma.
  • --set-active [SLOT]. Zaman aralığını etkin olarak ayarlayın. İsteğe bağlı bağımsız değişken yoksa belirtildiğinde, geçerli aralık etkin olarak ayarlanır.
  • fastboot --help Komutlarla ilgili ayrıntıları öğrenin.

Bootloader fastboot'u uyguluyorsa şu komutu desteklemelidir: Mevcut etkin zaman aralığını verilen zaman aralığına ayarlayan set_active <slot> ayrıca, söz konusu alan için başlatılamayan bayrağını temizlemeli ve yeniden deneme sayısını varsayılana sıfırlamalıdır ) sağlar. Bootloader aşağıdaki değişkenleri de desteklemelidir:

  • has-slot:<partition-base-name-without-suffix>. Verilen değer "evet" ise "evet" değerini döndürür bölüm, yuvaları destekler, aksi takdirde "hayır" değerini alır.
  • current-slot Sonrakinden başlatılacak alan son ekini döndürür.
  • slot-count. Kullanılabilir yuva sayısını temsil eden bir tam sayı döndürür. Şu anda iki alan desteklenmektedir, bu nedenle bu değer 2 şeklindedir.
  • slot-successful:<slot-suffix>. "Evet" değerini döndürür verilen zaman aralığı başarıyla başlatılıyor olarak işaretlendi, "hayır" aksi takdirde.
  • slot-unbootable:<slot-suffix>. Belirtilen alan işaretlenmişse "yes" değerini döndürür. "no" (hayır) şeklinde olabilir. aksi takdirde.
  • slot-retry-count:<slot-suffix>. Denemek için kalan yeniden deneme sayısı başlatın.

Tüm değişkenleri görüntülemek için fastboot getvar all

OTA paketleri oluşturma

OTA paketi araçları komutlarının sayısını azaltır. target_files.zip dosyası şu tarihe kadar oluşturulmalıdır: A/B hedefi için derleme değişkenlerini tanımlama. OTA paketi araçları, verileri ve A/B güncelleyici biçiminde paketler oluşturun.

Örnekler:

  • Tam OTA oluşturmak için:
    ./build/make/tools/releasetools/ota_from_target_files \
        dist_output/tardis-target_files.zip \
        ota_update.zip
    
  • Artımlı bir OTA oluşturmak için:
    ./build/make/tools/releasetools/ota_from_target_files \
        -i PREVIOUS-tardis-target_files.zip \
        dist_output/tardis-target_files.zip \
        incremental_ota_update.zip
    

Bölümleri yapılandırma

update_engine, aynı diskte tanımlanan herhangi bir A/B bölümü çiftini güncelleyebilir. Bir bölüm çifti, ortak bir ön eke sahiptir (system veya boot gibi) ve alan başına sonek (_a gibi). Yükün ait olduğu bölümlerin listesi oluşturucu bir güncellemenin AB_OTA_PARTITIONS marka değişkeni tarafından yapılandırıldığını tanımlar.

Örneğin, bir bölüm çifti bootloader_a ve booloader_b dahil (_a ve _b aralıktır sonekleri varsa ürün veya panoda aşağıdakileri belirterek bu bölümleri güncelleyebilirsiniz. yapılandırma:

AB_OTA_PARTITIONS := \
  boot \
  system \
  bootloader

update_engine tarafından güncellenen hiçbir bölüm, bahsedeceğim. Artımlı veya delta güncellemeler sırasında, mevcut aralıktaki ikili veriler yeni alandaki verileri oluşturmak için kullanılır. Herhangi bir değişiklik, yeni alan verilerinin başarısız olabilir ve bu nedenle güncelleme de başarısız olabilir.

Yükleme sonrası yapılandırma

Yükleme sonrası adımını, güncellenen her bölüm için anahtar/değer çiftleri. /system/usr/bin/postinst adresinde bulunan bir programı yeni bir görüntüsü içeriyorsa sistem bölümündeki dosya sisteminin köküne göre yolu belirtin.

Örneğin, usr/bin/postinst system/usr/bin/postinst (değilse) bir RAM diski kullanarak). Ayrıca, mount(2) sistem çağrısı. Aşağıdakileri ürüne veya cihaza ekleyin .mk dosya (varsa):

AB_OTA_POSTINSTALL_CONFIG += \
  RUN_POSTINSTALL_system=true \
  POSTINSTALL_PATH_system=usr/bin/postinst \
  FILESYSTEM_TYPE_system=ext4

Uygulamaları derleyin

Uygulamalar yeni sistem görüntüsüyle yeniden başlatmadan önce arka planda derlenebilir. Derlemek için arka planda kullandığınızda, aşağıdakini ürünün cihaz yapılandırmasına ekleyin ( ürünün device.mk):

  1. Derleme komut dosyasının ve ikili programların doğru olduğundan emin olmak için yerel bileşenleri derlemeye ekleyin derlenip sistem görüntüsüne eklenir.
      # A/B OTA dexopt package
      PRODUCT_PACKAGES += otapreopt_script
    
  2. Derleme komut dosyasını şu şekilde çalışan update_engine uygulamasına bağlayın: adımına geçelim.
      # A/B OTA dexopt update_engine hookup
      AB_OTA_POSTINSTALL_CONFIG += \
        RUN_POSTINSTALL_system=true \
        POSTINSTALL_PATH_system=system/bin/otapreopt_script \
        FILESYSTEM_TYPE_system=ext4 \
        POSTINSTALL_OPTIONAL_system=true
    

Önceden optimize edilen dosyaların kullanılmayan ikinci sistem bölümüne yüklenmesiyle ilgili yardım için şuraya bakın: DEX_PREOPT dosyalarının ilk başlatma yüklemesi.