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 update over-the-air (OTA).

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

Latar belakang

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

Di setiap perangkat blok, ada 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 sesuai dengan partisi di slot A dan B. Pada saat runtime, slot mana yang sedang diupdate tidak masalah.

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 selengkapnya tentang konfigurasi sistem build, lihat Mengupgrade perangkat.

Untuk mengetahui informasi selengkapnya tentang cara partisi termasuk dalam grup update, lihat Perubahan konfigurasi papan untuk perangkat baru.

Contoh metadata di 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 yang diperbarui oleh Foo
      • Grup bar_a
        • Partisi logis (dinamis) vendor_a
        • Partisi logis (dinamis) product_a
        • Partisi lain yang diperbarui berdasarkan Panel
    • 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 yang diperbarui oleh Foo
      • Grup bar_b
        • Partisi logis (dinamis) vendor_b
        • Partisi logis (dinamis) product_b
        • Partisi lain yang diperbarui oleh Panel

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

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

Melakukan retrofit update

Pada perangkat yang menjalankan Android 9 dan yang lebih lama, klien OTA di perangkat tidak mendukung pemetaan partisi dinamis sebelum update. Kumpulan patch tambahan dibuat sehingga pemetaan dapat diterapkan langsung ke partisi fisik yang ada.

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

Karena klien OTA tidak tahu cara memetakan partisi dinamis, semua langkah pasca-penginstalan dinonaktifkan secara otomatis untuk partisi ini saat paket update dibuat. Lihat Mengonfigurasi pasca-penginstalan untuk mengetahui detail selengkapnya.

Alur updatenya sama seperti di Android 9.

Sebelum update:

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

Setelah update:

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

Update mendatang setelah retrofit

Setelah update retrofit, klien OTA akan diupdate agar berfungsi dengan partisi dinamis. Ekstensi untuk partisi sumber tidak pernah mencakup partisi fisik target.

Alur update menggunakan paket update reguler

  1. Lakukan 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 baru M akan menggunakan [system_t, vendor_t, product_t] sebagai perangkat blok. Semua grup dan partisi dihapus di M.
    2. Tambahkan grup target dan partisi sesuai dengan kolom dynamic_partition_metadata dalam manifes update. Ukuran setiap partisi dapat ditemukan di new_partition_info.
    3. Tulis M ke Metadata T.
    4. Petakan partisi yang ditambahkan pada mapper perangkat sebagai dapat ditulis.
  2. Terapkan update di perangkat blok.
    1. Jika perlu, petakan partisi sumber di pemetaan perangkat sebagai hanya baca. Hal ini diperlukan untuk sideload karena partisi sumber tidak dipetakan sebelum update.
    2. Terapkan update penuh atau delta ke semua perangkat blok di slot target.
    3. Pasang partisi untuk menjalankan skrip pasca-penginstalan, lalu lepaskan partisi.
  3. Hapus pemetaan partisi target.

Alur update menggunakan paket update retrofit

Jika paket update retrofit diterapkan pada perangkat yang sudah mengaktifkan partisi dinamis, klien OTA akan menerapkan file super.img terpisah pada perangkat blok secara langsung. Alur update mirip dengan update retrofit. Lihat Melakukan Retrofit pada update untuk mengetahui 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.

Saat menerima paket update retrofit, klien OTA akan menerapkan super_system.img pada system_b fisik, super_vendor.img pada vendor_b fisik, dan super_product.img pada product_b fisik. Perangkat blok fisik system_b berisi metadata yang benar untuk memetakan system_b, vendor_b, dan product_b logis pada waktu booting.

Membuat paket update

OTA Inkremental

Saat membuat OTA inkremental untuk perangkat retrofit, update bergantung pada apakah build dasar menentukan PRODUCT_USE_DYNAMIC_PARTITIONS dan PRODUCT_RETROFIT_DYNAMIC_PARTITIONS atau tidak.

  • Jika build dasar tidak menentukan variabel, ini adalah update retrofit. Paket update berisi file super.img terpisah dan menonaktifkan langkah pasca-penginstalan.
  • Jika build dasar memang menentukan variabel, ini sama dengan update standar pada partisi dinamis. Paket update berisi image untuk partisi logis (dinamis). Langkah pasca-penginstalan dapat diaktifkan.

OTA lengkap

Dua paket OTA lengkap dibuat untuk perangkat retrofit.

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

Menolak update non-retrofit pada build lama

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

Untuk mencegah perangkat menerima paket OTA lengkap, Anda dapat mewajibkan langkah pasca-penginstalan untuk memeriksa konfigurasi perangkat yang ada. Contoh:

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 \

Saat paket OTA reguler diterapkan di perangkat tanpa mengaktifkan partisi dinamis, klien OTA akan menjalankan check_dynamic_partitions sebagai langkah pasca-penginstalan dan menolak update.