Android 10 mendukung partisi dinamis, sistem partisi ruang pengguna yang dapat membuat, mengubah ukuran, dan menghapus partisi selama update melalui udara (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 dipertahankan, sehingga tidak ada partisi super
di perangkat. Metadata disimpan di
system_a
dan system_b
, tetapi ini 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. 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 mengetahui 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 pemblokiran 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
- Partisi logis (dinamis)
- Grup
bar_a
- Partisi logis (dinamis)
vendor_a
- Partisi logis (dinamis)
product_a
- Partisi lain yang diperbarui oleh Bar
- Partisi logis (dinamis)
- Grup
- Metadata 1 (tidak digunakan)
- Metadata 0
- Perangkat pemblokiran fisik
system_b
- Metadata 0 (tidak digunakan)
- Metadata 1
- Group foo_b
- Partisi logis (dinamis)
system_b
- Partisi logis (dinamis)
product_services_b
- Partisi lain yang diperbarui oleh Foo
- Partisi logis (dinamis)
- Group bar_b
- Partisi logis (dinamis)
vendor_b
- Partisi logis (dinamis)
product_b
- Partisi lain yang diperbarui oleh Bar
- Partisi logis (dinamis)
- Group foo_b
Anda dapat menggunakan alat lpdump
di bagian
system/extras/partition_tools
untuk mengekspor metadata di
perangkat Anda. Contoh:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Memasang update
Pada perangkat yang menjalankan Android 9 dan yang lebih rendah, 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 membuat file super.img
akhir yang
berisi konten semua partisi dinamis, lalu membagi image
menjadi beberapa image 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 akan otomatis dinonaktifkan untuk partisi ini saat paket update dibuat. Lihat Mengonfigurasi setelah penginstalan untuk mengetahui detail selengkapnya.
Alur update 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 diupdate agar dapat berfungsi dengan partisi dinamis. Rentang untuk partisi sumber tidak pernah mencakup partisi fisik target.
Alur update menggunakan paket update reguler
- Lakukan inisialisasi metadata partisi
super
.-
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 dibatalkan di M. -
Tambahkan grup target dan partisi sesuai dengan
kolom
dynamic_partition_metadata
di manifes update. Ukuran setiap partisi dapat ditemukan dinew_partition_info
. - Menulis M ke Metadata T.
- Memetakan partisi yang ditambahkan di pemeta perangkat sebagai dapat ditulis.
-
Buat metadata M baru dari Metadata S (metadata sumber).
Misalnya, jika Metadata S menggunakan [
- Terapkan update pada perangkat yang diblokir.
- Jika perlu, petakan partisi sumber di pemeta perangkat sebagai hanya baca. Hal ini diperlukan untuk memuat dari luar karena partisi sumber tidak dipetakan sebelum update.
- Terapkan update penuh atau delta ke semua perangkat blok di slot target.
- Pasang partisi untuk menjalankan skrip pasca-penginstalan, lalu lepaskan partisi.
- Batalkan 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
yang dibagi pada perangkat blok secara langsung. Alur update
mirip dengan update retrofit. Lihat
Memasang update secara retroaktif
untuk mengetahui detailnya.
Misalnya, asumsikan hal berikut:
- Slot A adalah slot aktif.
-
system_a
berisi metadata aktif di slot 0. -
system_a
,vendor_a
, danproduct_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 penyesuaian. Paket update berisi file
super.img
terpisah dan menonaktifkan langkah setelah penginstalan. - Jika build dasar menentukan variabel, hal ini sama dengan update umum dengan partisi dinamis. Paket update berisi gambar untuk partisi logis (dinamis). Langkah setelah penginstalan dapat diaktifkan.
OTA Penuh
Dua paket OTA penuh dibuat untuk perangkat retrofit.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
selalu berisi splitsuper.img
dan menonaktifkan langkah pasca-penginstalan untuk update penyesuaian.-
Kunci ini dibuat dengan argumen tambahan
--retrofit_dynamic_partitions
ke skripota_from_target_files
. - Hal ini dapat diterapkan pada semua build.
-
Kunci ini dibuat dengan argumen tambahan
-
$(PRODUCT)-ota-$(TAG).zip
berisi gambar logis untuk update mendatang.- Terapkan ini hanya untuk build dengan partisi dinamis yang diaktifkan. Lihat detail tentang penegakannya di bawah.
Menolak update non-retrofit pada build lama
Terapkan paket OTA penuh reguler hanya ke build dengan partisi dinamis yang diaktifkan. Jika server OTA dikonfigurasi dengan tidak benar dan mengirimkan paket ini ke perangkat yang menjalankan Android 9 atau yang lebih rendah, perangkat akan gagal di-boot. Klien OTA di Android 9 dan yang lebih rendah tidak dapat membedakan antara paket OTA retrofit dan paket OTA penuh reguler, sehingga klien tidak akan menolak paket penuh.
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 \
Jika paket OTA reguler diterapkan pada perangkat tanpa mengaktifkan partisi dinamis, klien OTA akan menjalankan check_dynamic_partitions
sebagai langkah pasca-penginstalan dan menolak update.