OTA untuk perangkat A/B tanpa partisi dinamis

Android 10 mendukung partisi dinamis , sistem partisi ruang pengguna yang dapat membuat, mengubah ukuran, dan menghancurkan partisi selama pembaruan over-the-air (OTA).

Halaman ini menjelaskan cara klien OTA mengubah ukuran partisi dinamis selama pembaruan untuk perangkat A/B yang diluncurkan tanpa dukungan partisi dinamis dan cara klien OTA melakukan upgrade ke Android 10.

Latar belakang

Selama pembaruan perangkat A/B untuk mendukung partisi dinamis, tabel partisi GUID (GPT) pada perangkat dipertahankan, sehingga tidak ada partisi super pada perangkat. Metadata disimpan di system_a dan system_b , tetapi ini dapat dikustomisasi dengan mengubah BOARD_SUPER_PARTITION_METADATA_DEVICE .

Di setiap perangkat blok, terdapat dua slot metadata. Hanya satu slot metadata di setiap perangkat blok yang digunakan. Misalnya, Metadata 0 di system_a dan Metadata 1 di system_b masing-masing berhubungan dengan partisi di slot A dan B. Saat runtime, tidak masalah slot mana yang diperbarui.

Di halaman ini, slot metadata disebut Metadata S (sumber) dan Metadata T (target). Demikian pula, partisi disebut sebagai system_s , vendor_t , dan seterusnya.

Untuk informasi lebih lanjut tentang konfigurasi sistem build , lihat Mengupgrade perangkat .

Untuk informasi lebih lanjut tentang bagaimana partisi menjadi bagian dari grup pembaruan , lihat Perubahan konfigurasi papan untuk perangkat baru.

Contoh metadata pada suatu perangkat adalah:

  • Perangkat blok fisik system_a
    • Metadata 0
      • Grup foo_a
        • Partisi logis (dinamis) system_a
        • Partisi logis (dinamis) product_services_a
        • Partisi lain diperbarui oleh Foo
      • Grup bar_a
        • Partisi logis (dinamis) vendor_a
        • Partisi logis (dinamis) product_a
        • Partisi lain diperbarui oleh Bar
    • Metadata 1 (tidak digunakan)
  • Perangkat blok fisik system_b
    • Metadata 0 (tidak digunakan)
    • Metadata 1
      • Grup foo_b
        • Partisi logis (dinamis) system_b
        • Partisi logis (dinamis) product_services_b
        • Partisi lain diperbarui oleh Foo
      • Grup bar_b
        • Partisi logis (dinamis) vendor_b
        • Partisi logis (dinamis) product_b
        • Partisi lain diperbarui oleh Bar

Anda dapat menggunakan alat lpdump di bawah system/extras/partition_tools untuk membuang metadata di perangkat Anda. Misalnya:

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

Pasang kembali pembaruan

Pada perangkat yang menjalankan Android 9 dan lebih rendah, klien OTA pada perangkat tidak mendukung pemetaan partisi dinamis sebelum pembaruan. Serangkaian patch tambahan dibuat sehingga pemetaan dapat diterapkan langsung ke partisi fisik yang ada.

Generator OTA membuat file super.img akhir yang berisi konten semua partisi dinamis, kemudian membagi gambar menjadi beberapa gambar yang sesuai dengan ukuran perangkat blok fisik yang sesuai dengan sistem, vendor, dan sebagainya. Gambar-gambar ini diberi nama super_system.img , super_vendor.img , dan seterusnya. Klien OTA menerapkan gambar-gambar ini ke partisi fisik, daripada menerapkan gambar untuk partisi logis (dinamis).

Karena klien OTA tidak mengetahui cara memetakan partisi dinamis, semua langkah pasca-instalasi dinonaktifkan secara otomatis untuk partisi ini ketika paket pembaruan dibuat. Lihat Mengonfigurasi pasca-instalasi untuk lebih jelasnya.

Alur pembaruannya sama seperti di Android 9.

Sebelum pembaruan:

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

Setelah pembaruan:

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

Pembaruan di masa mendatang setelah retrofit

Setelah pembaruan retrofit, klien OTA diperbarui agar berfungsi dengan partisi dinamis. Luasan partisi sumber tidak pernah menjangkau seluruh partisi fisik target.

Alur pembaruan menggunakan paket pembaruan reguler

  1. Inisialisasi metadata partisi super .
    1. Buat metadata M baru dari Metadata S (metadata sumber). Misalnya, jika Metadata S menggunakan [ system_s , vendor_s , product_s ] sebagai perangkat blok, maka metadata M baru menggunakan [ system_t , vendor_t , product_t ] sebagai perangkat blok. Semua grup dan partisi dibuang di M.
    2. Tambahkan grup target dan partisi sesuai dengan bidang dynamic_partition_metadata di manifes pembaruan. Ukuran setiap partisi dapat ditemukan di new_partition_info .
    3. Tulis M ke Metadata T.
    4. Petakan partisi yang ditambahkan pada pemeta perangkat sebagai dapat ditulisi.
  2. Terapkan pembaruan pada perangkat blok.
    1. Jika perlu, petakan partisi sumber pada pemeta perangkat sebagai hanya baca. Ini diperlukan untuk melakukan sideload karena partisi sumber tidak dipetakan sebelum pembaruan.
    2. Terapkan pembaruan penuh atau delta ke semua perangkat blok di slot target.
    3. Pasang partisi untuk menjalankan skrip pasca-instalasi, lalu lepaskan partisi tersebut.
  3. Hapus peta partisi target.

Alur pembaruan menggunakan paket pembaruan retrofit

Jika paket pembaruan retrofit diterapkan pada perangkat yang sudah mengaktifkan partisi dinamis, klien OTA menerapkan file super.img terpisah pada perangkat blok secara langsung. Alur pembaruan mirip dengan pembaruan retrofit. Lihat Memperbaiki pembaruan untuk detailnya.

Misalnya, asumsikan hal berikut:

  • Slot A adalah slot aktif.
  • system_a berisi metadata aktif di slot 0.
  • system_a , vendor_a , dan product_a digunakan sebagai perangkat blok.

Ketika klien OTA menerima paket pembaruan retrofit, itu berlaku super_system.img pada fisik system_b , super_vendor.img pada fisik vendor_b , dan super_product.img pada fisik product_b . Perangkat blok fisik system_b berisi metadata yang benar untuk memetakan logika system_b , vendor_b , dan product_b pada saat boot.

Hasilkan paket pembaruan

OTA tambahan

Saat membuat OTA tambahan untuk perangkat retrofit, pembaruan bergantung pada apakah build dasar mendefinisikan PRODUCT_USE_DYNAMIC_PARTITIONS dan PRODUCT_RETROFIT_DYNAMIC_PARTITIONS atau tidak.

  • Jika build dasar tidak menentukan variabel, ini adalah pembaruan retrofit. Paket pembaruan berisi file super.img yang dipecah dan menonaktifkan langkah pasca-instalasi.
  • Jika build dasar menentukan variabel, ini sama dengan pembaruan biasa dengan partisi dinamis. Paket pembaruan berisi gambar untuk partisi logis (dinamis). Langkah pasca instalasi dapat diaktifkan.

OTA penuh

Dua paket OTA lengkap dibuat untuk perangkat retrofit.

  • $(PRODUCT)-ota-retrofit-$(TAG).zip selalu berisi super.img terpisah dan menonaktifkan langkah pasca-pemasangan untuk pembaruan retrofit.
    • Ini dihasilkan dengan argumen tambahan --retrofit_dynamic_partitions ke skrip ota_from_target_files .
    • Itu dapat diterapkan ke semua build.
  • $(PRODUCT)-ota-$(TAG).zip berisi gambar logis untuk pembaruan di masa mendatang.
    • Terapkan ini hanya untuk build dengan partisi dinamis diaktifkan. Lihat detail di bawah tentang penerapan hal ini.

Tolak pembaruan nonretrofit pada versi lama

Terapkan paket OTA lengkap reguler hanya untuk build dengan partisi dinamis diaktifkan. Jika server OTA tidak dikonfigurasi dengan benar dan mengirimkan paket ini ke perangkat yang menjalankan Android 9 atau lebih rendah, perangkat gagal melakukan booting. Klien OTA di Android 9 dan yang lebih rendah tidak dapat membedakan antara paket OTA retrofit dan paket OTA lengkap biasa, sehingga klien tidak akan menolak paket lengkap.

Untuk mencegah perangkat menerima paket OTA lengkap, Anda dapat memerlukan langkah pasca instalasi untuk memeriksa konfigurasi perangkat yang ada. Misalnya:

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 \

Ketika paket OTA reguler diterapkan pada perangkat tanpa partisi dinamis diaktifkan, klien OTA menjalankan check_dynamic_partitions sebagai langkah pasca-instalasi dan menolak pembaruan.