Dinamik bölümü olmayan A/B cihazları için OTA

Android 10 destekler dinamik bölümler, bir kullanıcı alanı bölümlendirmesi kablosuz güncellemeler sırasında bölümleri oluşturabilen, yeniden boyutlandırabilen ve yok eden bir sistemdir.

Bu sayfada, OTA istemcilerinin A/B cihazları için güncelleme sırasında dinamik bölümleri nasıl yeniden boyutlandırdığı açıklanmaktadır kullanıma sunulan uygulamamızı keşfedin.

Arka plan

Dinamik bölümleri desteklemek için bir A/B cihazının güncellenmesi sırasında Cihazdaki GUID bölüm tablosu (GPT) korunduğu için Cihazda super bölümü. Meta veriler şurada depolanır: system_a ve system_b ancak bu olabilir BOARD_SUPER_PARTITION_METADATA_DEVICE değiştirilerek özelleştirilmiş.

Blok cihazların her birinde iki meta veri yuvası bulunur. Yalnızca bir her blok cihazdaki meta veri yuvası kullanılır. Örneğin, Meta Veri 0, system_a ve Meta Veri 1, system_b sırasıyla A ve B yuvalarındaki bölümlere karşılık gelir. Kuyruklu a işareti hangi alanın güncellendiği önemli değildir.

Bu sayfada, meta veri yuvaları Metadata S (Meta Veri S) olarak adlandırılır. (kaynak) ve Meta Veri T (hedef) olur. Benzer şekilde, bölümler system_s, vendor_t vb. olarak değiştirin.

Sistem yapılandırmaları oluşturma hakkında daha fazla bilgi edinmek için Cihazların yeni sürüme geçirilmesi.

Bölümlerin nasıl çalıştığı hakkında daha fazla bilgi: update gruplarıyla ilgili daha fazla bilgi Masa yeni cihazlar için yapılandırma değişiklikleri başlıklı makaleyi inceleyin.

Bir cihazdaki meta veri örneği:

  • Fiziksel blok cihazı system_a
    • Meta Veri 0
      • Grup foo_a
        • Mantıksal (dinamik) bölümlendirme system_a
        • Mantıksal (dinamik) bölümlendirme product_services_a.
        • Foo tarafından güncellenen diğer bölümler
      • Grup bar_a
        • Mantıksal (dinamik) bölümlendirme vendor_a
        • Mantıksal (dinamik) bölümlendirme product_a.
        • Çubuk tarafından güncellenen diğer bölümler
    • Meta veri 1 (kullanılmıyor)
  • Fiziksel blok cihazı system_b
    • Meta veri 0 (kullanılmıyor)
    • Meta veri 1
      • foo_b grubu
        • Mantıksal (dinamik) bölümlendirme system_b.
        • Mantıksal (dinamik) bölümlendirme product_services_b.
        • Foo tarafından güncellenen diğer bölümler
      • Grup çubuğu_b
        • Mantıksal (dinamik) bölümlendirme vendor_b.
        • Mantıksal (dinamik) bölümlendirme product_b.
        • Çubuk tarafından güncellenen diğer bölümler

Şuradaki lpdump aracını kullanabilirsiniz: Meta verilerin dökümü için system/extras/partition_tools en iyi yoludur. Örnek:

lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b

Güncellemeyi yenileme

Android 9 ve önceki sürümleri çalıştıran cihazlarda, cihazdaki OTA istemcisi , güncellemeden önce dinamik bölümlerin eşlenmesini desteklemiyor. Eşleme uygulanabilmesi için ek bir yama kümesi oluşturulur doğrudan mevcut fiziksel bölümlere yönlendirme yapabilirsiniz.

OTA oluşturucu, yeni bir sürüm super.img tüm dinamik bölümlerin içeriğini içeriyorsa, daha sonra resmi böler fiziksel blok cihazların boyutlarına uygun birden çok resme her şeyi kapsıyor. Bu görsellere ad verilmiştir super_system.img, super_vendor.img vb. OTA istemcisi bu görüntüleri fiziksel bölümlere uygular mantıksal (dinamik) bölümlere uygulamaktan daha iyidir.

OTA istemcisi dinamik bölümlerin nasıl eşleneceğini bilmediği için Bu bölümler için tüm yükleme sonrası adımlar otomatik olarak devre dışı bırakılır güncelleme paketi oluşturulduğunda. Görüntüleyin Yükleme sonrası yapılandırma inceleyebilirsiniz.

Güncelleme akışı Android 9'dakiyle aynıdır.

Güncellemeden önce:

ro.boot.dynamic_partitions=
ro.boot.dynamic_partitions_retrofit=

Güncellemeden sonra:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

Düzeltme sonrası yapılacak güncellemeler

Güçlendirme güncellemesinden sonra OTA istemcisi dinamik bölümlerle gösterilir. Kaynak bölümlerinin uzantıları hiçbir zaman kapsamaz veya hedef fiziksel bölümlerde gösterilir.

Normal güncelleme paketi kullanarak akışı güncelleme

  1. super bölümü meta verilerini başlatın.
    1. Meta Veri S'den (kaynak meta veri) yeni meta veri M oluşturun. Örneğin, Meta Veri S'de [system_s, vendor_s, product_s] blok olarak cihaz kullanıyorsanız yeni meta veri M'de [system_t, vendor_t, product_t] blok olarak cihazlar. M'de tüm gruplar ve bölümler silinir.
    2. Şuna göre hedef grupları ve bölümleri ekleyin: Güncellemedeki dynamic_partition_metadata alanı manifest'ini kullanabilirsiniz. Her bölümün boyutu şurada bulunabilir: new_partition_info
    3. M'ye Meta Veri T'ye yazma.
    4. Cihaz haritalayıcısına eklenen bölümleri yazılabilir olarak eşleyin.
  2. Güncellemeyi engelleme cihazlarına uygulayın.
    1. Gerekirse kaynak bölümlerini cihaz eşleyicisinde eşleyin salt okunur olarak ayarla. Bu, başka cihazdan yükleme için gereklidir çünkü kaynak bölümleri güncellemeden önce eşlenmez.
    2. Şuradaki tüm blok cihazlara tam veya delta güncellemesi uygula: unutmayın.
    3. Yükleme sonrası komut dosyasını çalıştırmak için bölümleri ekleyin ve bölümleri kaldırın.
  3. Hedef bölümlerin eşlemesini kaldırın.

Akışı, geriye dönük düzenleme güncelleme paketi kullanarak güncelleme

Güçlendirme güncelleme paketi halihazırda dinamik bölümleri etkinleştirirse OTA istemcisi bölme işlemini uygular Doğrudan engellenen cihazlarda super.img dosyası mevcut. Güncelleme retrospektif güncellemesine benzer. Görüntüleyin Güncellemeleri yeniden düzenleme inceleyebilirsiniz.

Örneğin, aşağıdakilerin geçerli olduğunu varsayalım:

  • A yuvası etkin yuvadır.
  • system_a, 0. alanda etkin meta verileri içeriyor.
  • system_a, vendor_a ve product_a blok cihaz olarak kullanılıyor.

OTA istemcisi bir geriye dönük güncelleme güncelleme paketi aldığında, super_system.img, fiziksel system_b, vendor_b fiziksel mağazada super_vendor.img ve product_b adlı fiziksel saatte super_product.img. system_b fiziksel blok cihazı doğru mantıksal system_b öğesini eşlemek için meta verileri, Açılış sırasında vendor_b ve product_b.

Güncelleme paketleri oluşturma

Artımlı OTA

Koruma amaçlı cihazlar için artımlı OTA'lar oluştururken güncellemeler temel derlemenin tanımlanıp tanımlanmadığına PRODUCT_USE_DYNAMIC_PARTITIONS ve PRODUCT_RETROFIT_DYNAMIC_PARTITIONS.

  • Temel derleme değişkenleri tanımlamıyorsa bu yenileme güncellemesi. Güncelleme paketi, super.img dosyasına sahip olan ve yükleme sonrası adımını devre dışı bırakır.
  • Temel derleme değişkenleri tanımlıyorsa bu, dinamik bölümlendirmelere sahip tipik güncelleme. Güncelleme paketi mantıksal (dinamik) bölümlerin resimlerini içerir. İlgili içeriği oluşturmak için kullanılan yükleme sonrası adımı etkinleştirilebilir.

Tam OTA

Koruma cihazları için iki tam OTA paketi oluşturulur.

  • $(PRODUCT)-ota-retrofit-$(TAG).zip daima şunu içerir: super.img öğesini böler ve yükleme sonrası adımı devre dışı bırakır izin verilir.
    • Ek bir bağımsız değişkenle oluşturulur --retrofit_dynamic_partitions - ota_from_target_files komut dosyası.
    • Tüm derlemelere uygulanabilir.
  • $(PRODUCT)-ota-$(TAG).zip, şunun için mantıksal resimleri içerir: takip edebilirsiniz.
    • Bunu yalnızca dinamik bölümlendirmelere sahip derlemelere uygulayın etkin. Bunu zorunlu kılmayla ilgili ayrıntıları aşağıda bulabilirsiniz.

Eski derlemelerde geriye dönük olmayan güncellemeyi reddet

Normal tam OTA paketini yalnızca dinamik bölümlerin etkinleştirildiğinden emin olun. OTA sunucusu yapılandırıldıysa ve bu paketleri Android 9 veya sonraki sürümleri çalıştıran cihazlara aktarır cihaz başlatılamaz. Android 9 ve sonraki sürümlerde OTA istemcisi OTA paketi ile standart geliştirme paketi arasındaki istemci tam paketi reddetmez.

Cihazın OTA paketinin tamamını kabul etmesini önlemek için şunları yapabilirsiniz: Mevcut cihazı kontrol etmek için yükleme sonrası adım yapılması gerekir yapılandırma. Örnek:

device/device_name/dynamic_partitions/check_dynamic_partitions

#!/system/bin/sh
DP_PROPERTY_NAME="ro.boot.dynamic_partitions"
DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit"

DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME})
DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME})

if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then
    echo "Error: applied non-retrofit update on build without dynamic" \
         "partitions."
    echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}"
    echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}"
    exit 1
fi

device/device_name/dynamic_partitions/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= check_dynamic_partitions
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := check_dynamic_partitions
LOCAL_PRODUCT_MODULE := true
include $(BUILD_PREBUILT)

device/device_name/device.mk

PRODUCT_PACKAGES += check_dynamic_partitions

# OPTIONAL=false so that the error in check_dynamic_partitions will be
# propagated to OTA client.
AB_OTA_POSTINSTALL_CONFIG += \
    RUN_POSTINSTALL_product=true \
    POSTINSTALL_PATH_product=bin/check_dynamic_partitions \
    FILESYSTEM_TYPE_product=ext4 \
    POSTINSTALL_OPTIONAL_product=false \

Dinamik olmayan bir cihaza normal OTA paketi uygulandığında bölümleri etkinleştirdiğinizde, OTA istemcisi check_dynamic_partitions, yükleme sonrası bir adım olarak güncellemeyi reddeder.