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 sürümünü yükseltme.

Bölümlerin güncelleme gruplarına nasıl ait olduğu hakkında daha fazla bilgi edinmek için yeni cihazlardaki Kart yapılandırma değişiklikleri bölümüne bakın.

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
      • Grup foo_b
        • Mantıksal (dinamik) bölüm system_b
        • Mantıksal (dinamik) bölüm 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üm product_b
        • Çubuk tarafından güncellenen diğer bölümler

Cihazınızdaki meta verileri dökmek için system/extras/partition_tools altındaki lpdump aracını kullanabilirsiniz. Ö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ümlerin yüklü olduğu cihazlardaki OTA istemcisi, güncellemeden önce dinamik bölümlerin eşlenmesini desteklemez. 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, tüm dinamik bölümlerin içeriğini içeren nihai super.img dosyasını oluşturur, ardından resmi sistem, tedarikçi vb.'ye karşılık gelen fiziksel blok cihazlarının boyutlarına uygun birden fazla resme böler. Bu resimler super_system.img, super_vendor.img vb. şeklinde adlandırılır. OTA istemcisi, bu resimleri mantıksal (dinamik) bölümlere uygulamak yerine fiziksel bölümlere uygular.

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

Güncelleme akışı, Android 9 ile aynıdır.

Güncellemeden önce:

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

Güncelleme sonrasında:

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ümlerin kapsamları hiçbir zaman hedef fiziksel bölümlere yayılmaz.

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

  1. super bölümü meta verilerini başlatın.
    1. S meta verisi (kaynak meta veri) ile yeni M meta verisi oluşturun. Örneğin, S meta verisi engelleme cihazları olarak [system_s, vendor_s, product_s] kullanıyorsa yeni M meta verisi, engelleme cihazları olarak [system_t, vendor_t, product_t] kullanır. 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'yi T meta verilerine yazın.
    4. Cihaz haritalayıcısına eklenen bölümleri yazılabilir olarak eşleyin.
  2. Güncellemeyi engellenen cihazlara 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. Hedef yuvada tüm engelleme cihazlarına tam veya delta güncellemesi uygulayın.
    3. Yükleme sonrası komut dosyasını çalıştırmak için bölümleri monte edin ve ardından bölümlerin montesini kaldırın.
  3. Hedef bölümlerin eşlemesini kaldırın.

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

Retrofit güncelleme paketi, dinamik bölümleri zaten etkinleştirmiş bir cihaza uygulanırsa OTA istemcisi, bölünmüş super.img dosyasını doğrudan blok cihazlara uygular. Güncelleme akışı, sonradan yapılan güncellemeye 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 engelleme cihazı olarak kullanılır.

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, bölünmüş super.img dosyasını içerir ve yükleme sonrası adımı 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. Yükleme sonrası adım etkinleştirilebilir.

Tam OTA

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

  • $(PRODUCT)-ota-retrofit-$(TAG).zip her zaman super.img bölünmüş içerir ve güncellemeyi sonradan uygulamak için yükleme sonrası adımı devre dışı bırakır.
    • Komut dosyası, ota_from_target_files komut dosyasına ek bir --retrofit_dynamic_partitions bağımsız değişkeni eklenerek oluşturulur.
    • 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. Bu politikanın uygulanmasıyla 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 etkin olduğu derlemelere uygulayın. OTA sunucusu yanlış yapılandırılmışsa ve bu paketleri Android 9 veya daha eski sürümleri çalıştıran cihazlara gönderirse cihazlar başlatılamaz. Android 9 ve önceki sürümlerdeki OTA istemcisi, geriye dönük OTA paketi ile normal tam OTA paketi arasındaki farkı anlayamaz. Bu nedenle 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.