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

Android 10, kablosuz (OTA) güncellemeler sırasında bölümler oluşturabilen, yeniden boyutlandırabilen ve yok edebilen bir kullanıcı alanı bölümleme sistemi olan dinamik bölümleri destekler.

Bu sayfada, dinamik bölüm desteği olmadan başlatılan A/B cihazları için bir güncelleme sırasında OTA istemcilerinin dinamik bölümleri nasıl yeniden boyutlandırdığı ve OTA istemcilerinin Android 10'a nasıl yükselttiği açıklanmaktadır.

Arka plan

Dinamik bölümleri desteklemek için bir A/B aygıtının güncellenmesi sırasında, aygıttaki GUID bölümleme tablosu (GPT) korunur, dolayısıyla aygıtta super bölüm olmaz. Meta veriler system_a ve system_b depolanır, ancak bu BOARD_SUPER_PARTITION_METADATA_DEVICE değiştirilerek özelleştirilebilir.

Blok cihazlarının her birinde iki meta veri yuvası vardır. Her blok cihazında yalnızca bir meta veri yuvası kullanılır. Örneğin, system_a Meta Veri 0 ve system_b Meta Veri 1, sırasıyla A ve B yuvalarındaki bölümlere karşılık gelir. Çalışma zamanında hangi slotun güncellendiği önemli değildir.

Bu sayfada meta veri yuvalarına Meta Veri S (kaynak) ve Meta Veri T (hedef) adı verilir. Benzer şekilde bölümlere system_s , vendor_t vb. adlar verilir.

Sistem yapılandırmalarını oluşturma hakkında daha fazla bilgi için bkz. Cihazları yükseltme .

Bölümlerin güncelleme gruplarına nasıl ait olduğu hakkında daha fazla bilgi için bkz. Yeni cihazlar için kart yapılandırma değişiklikleri .

Bir cihazdaki meta verilere örnek:

  • Fiziksel blok cihazı system_a
    • Meta veriler 0
      • Grup foo_a
        • Mantıksal (dinamik) bölümleme system_a
        • Mantıksal (dinamik) bölümleme product_services_a
        • Foo tarafından güncellenen diğer bölümler
      • Grup bar_a
        • Mantıksal (dinamik) bölüm vendor_a
        • Mantıksal (dinamik) bölümleme product_a
        • Bar 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 veriler 1
      • Foo_b grubu
        • Mantıksal (dinamik) bölümleme system_b
        • Mantıksal (dinamik) product_services_b
        • Foo tarafından güncellenen diğer bölümler
      • Grup bar_b
        • Mantıksal (dinamik) bölüm vendor_b
        • Mantıksal (dinamik) bölümleme product_b
        • Bar tarafından güncellenen diğer bölümler

Meta verileri cihazınıza boşaltmak için system/extras/partition_tools altındaki lpdump aracını kullanabilirsiniz. Örneğin:

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

Bir güncellemeyi güçlendirme

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

OTA oluşturucu, tüm dinamik bölümlerin içeriğini içeren son super.img dosyasını oluşturur ve ardından görüntüyü, sistem, satıcı vb. ile ilgili fiziksel blok cihazlarının boyutlarıyla eşleşen birden fazla görüntüye böler. Bu görüntüler super_system.img , super_vendor.img vb. olarak adlandırılır. OTA istemcisi, görüntüleri mantıksal (dinamik) bölümlere uygulamak yerine bu görüntüleri fiziksel bölümlere uygular.

OTA istemcisi dinamik bölümleri nasıl eşleyeceğini bilmediğinden, güncelleme paketi oluşturulduğunda bu bölümler için tüm kurulum sonrası adımlar otomatik olarak devre dışı bırakılır. Daha fazla ayrıntı için bkz . Kurulum sonrası yapılandırma .

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

Yenileme sonrasında gelecek güncellemeler

Güçlendirme güncellemesinden sonra OTA istemcisi dinamik bölümlerle çalışacak şekilde güncellenir. Kaynak bölümlerinin kapsamları hiçbir zaman hedef fiziksel bölümlere yayılmaz.

Düzenli bir güncelleme paketi kullanarak akışı güncelleyin

  1. super bölüm meta verilerini başlatın.
    1. Meta Veri S'den (kaynak meta veriler) yeni meta veriler M oluşturun. Örneğin, Meta Veri S, blok aygıtları olarak [ system_s , vendor_s , product_s ] kullanıyorsa, yeni meta veri M, blok aygıtlar olarak [ system_t , vendor_t , product_t ] kullanır. M'deki tüm gruplar ve bölümler atılır.
    2. Güncelleme bildirimindeki dynamic_partition_metadata alanına göre hedef grupları ve bölümleri ekleyin. Her bölümün boyutu new_partition_info bulunabilir.
    3. Meta Veri T'ye M yazın.
    4. Eklenen bölümleri aygıt eşleyicide yazılabilir olarak eşleyin.
  2. Güncellemeyi blok cihazlara uygulayın.
    1. Gerekirse cihaz eşleyicideki kaynak bölümlerini salt okunur olarak eşleyin. Kaynak bölümler güncellemeden önce eşlenmediğinden bu, yandan yükleme için gereklidir.
    2. Hedef yuvadaki tüm blok cihazlara tam veya delta güncelleme uygulayın.
    3. Kurulum sonrası betiği çalıştırmak için bölümleri bağlayın ve ardından bölümlerin bağlantısını kesin.
  3. Hedef bölümlerin eşlemesini kaldırın.

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

Güçlendirme güncelleme paketi zaten dinamik bölümleri etkinleştiren bir cihaza uygulanırsa, OTA istemcisi bölünmüş super.img dosyasını doğrudan blok cihazlara uygular. Güncelleme akışı, güçlendirme güncellemesine benzer. Ayrıntılar için bkz . Güncellemeyi yenileme .

Örneğin aşağıdakileri varsayalım:

  • Slot A aktif slottur.
  • system_a 0 yuvasındaki etkin meta verileri içerir.
  • system_a , vendor_a ve product_a blok cihazları olarak kullanılır.

OTA istemcisi bir retrofit güncelleme paketi aldığında, fiziksel system_b super_system.img , fiziksel vendor_b super_vendor.img ve fiziksel product_b super_product.img uygular. Fiziksel blok aygıtı system_b önyükleme sırasında mantıksal system_b , vendor_b ve product_b eşlemek için doğru meta verileri içerir.

Güncelleme paketleri oluştur

Artımlı OTA

Retrofit cihazlar için artımlı OTA'lar oluştururken güncellemeler, temel yapının PRODUCT_USE_DYNAMIC_PARTITIONS ve PRODUCT_RETROFIT_DYNAMIC_PARTITIONS tanımlayıp tanımlamamasına bağlıdır.

  • Temel yapı değişkenleri tanımlamıyorsa bu bir güçlendirme güncellemesidir. Güncelleme paketi bölünmüş super.img dosyasını içerir ve kurulum sonrası adımı devre dışı bırakır.
  • Temel yapı değişkenleri tanımlıyorsa bu, dinamik bölümlere sahip tipik bir güncellemeyle aynıdır. Güncelleme paketi mantıksal (dinamik) bölümlere ait görüntüleri içerir. Kurulum sonrası adım etkinleştirilebilir.

Tam OTA

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

  • $(PRODUCT)-ota-retrofit-$(TAG).zip her zaman split super.img içerir ve güncellemeyi yenilemek için kurulum sonrası adımını devre dışı bırakır.
    • ota_from_target_files betiğine --retrofit_dynamic_partitions ek argümanıyla oluşturulur.
    • Tüm yapılara uygulanabilir.
  • $(PRODUCT)-ota-$(TAG).zip gelecekteki güncellemeler için mantıksal görseller içerir.
    • Bunu yalnızca dinamik bölümlerin etkin olduğu yapılara uygulayın. Bunu uygulamaya ilişkin aşağıdaki ayrıntılara bakın.

Eski yapılarda retrofit olmayan güncellemeyi reddet

Normal tam OTA paketini yalnızca dinamik bölümlerin etkin olduğu yapılara uygulayın. OTA sunucusu yanlış yapılandırılırsa ve bu paketleri Android 9 veya daha düşük sürüm çalıştıran cihazlara gönderirse cihazlar önyükleme yapamaz. Android 9 ve önceki sürümlerdeki OTA istemcisi, retrofit OTA paketi ile normal tam OTA paketi arasındaki farkı anlayamaz, dolayısıyla müşteri tam paketi reddetmez.

Cihazın tam OTA paketini kabul etmesini önlemek için, mevcut cihaz yapılandırmasını kontrol etmek üzere kurulum sonrası bir adıma ihtiyaç duyabilirsiniz. Örneğin:

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 bölümlerin etkin olmadığı bir cihaza normal OTA paketi uygulandığında, OTA istemcisi kurulum sonrası adım olarak check_dynamic_partitions çalıştırır ve güncellemeyi reddeder.