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 bagaimana klien OTA mengubah ukuran partisi dinamis selama pembaruan untuk perangkat A/B yang diluncurkan tanpa dukungan partisi dinamis dan bagaimana klien OTA meningkatkan 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_b
system_a
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 informasi lebih lanjut tentang konfigurasi sistem build , lihat Mengupgrade perangkat .
Untuk informasi selengkapnya tentang bagaimana partisi termasuk dalam grup pembaruan , lihat Perubahan konfigurasi papan untuk perangkat baru.
Contoh metadata pada perangkat adalah:
- Perangkat blok fisik
system_a
- Metadata 0
- Grup
foo_a
- Sistem partisi logis (dinamis)
system_a
- Partisi logis (dinamis)
product_services_a
- Partisi lain diperbarui oleh Foo
- Sistem partisi logis (dinamis)
- Grup
bar_a
- Vendor partisi logis (dinamis)
vendor_a
- Produk partisi logis (dinamis)
product_a
- Partisi lain diperbarui oleh Bar
- Vendor partisi logis (dinamis)
- Grup
- Metadata 1 (tidak digunakan)
- Metadata 0
- Perangkat blok fisik
system_b
- Metadata 0 (tidak digunakan)
- Metadata 1
- Grup foo_b
- Sistem partisi logis (dinamis)
system_b
- Partisi logis (dinamis)
product_services_b
- Partisi lain diperbarui oleh Foo
- Sistem partisi logis (dinamis)
- Grup bar_b
- Vendor partisi logis (dinamis)
vendor_b
- Partisi logis (dinamis)
product_b
- Partisi lain diperbarui oleh Bar
- Vendor partisi logis (dinamis)
- Grup foo_b
Anda dapat menggunakan alat lpdump
di bawah system/extras/partition_tools
untuk membuang metadata di perangkat Anda. Sebagai contoh:
lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b
Memasang kembali pembaruan
Pada perangkat yang menjalankan Android 9 dan lebih rendah, klien OTA di perangkat tidak mendukung pemetaan partisi dinamis sebelum pembaruan. Satu set tambalan tambahan dibuat sehingga pemetaan dapat diterapkan langsung ke partisi fisik yang ada.
Generator OTA membangun file super.img
akhir yang berisi konten dari semua partisi dinamis, kemudian membagi gambar menjadi beberapa gambar yang cocok 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 ini ke partisi fisik, daripada menerapkan gambar untuk partisi logis (dinamis).
Karena klien OTA tidak tahu cara memetakan partisi dinamis, semua langkah pasca-instal dinonaktifkan secara otomatis untuk partisi ini saat paket pembaruan dibuat. Lihat Mengonfigurasi pasca-instalasi untuk detail selengkapnya.
Alur pembaruan 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 untuk bekerja dengan partisi dinamis. Luasan untuk partisi sumber tidak pernah menjangkau seluruh partisi fisik target.
Aliran pembaruan menggunakan paket pembaruan reguler
- Inisialisasi metadata partisi
super
.- Bangun 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 menggunakan [system_t
,vendor_t
,product_t
] sebagai perangkat blok. Semua grup dan partisi dibuang di M. - Tambahkan grup dan partisi target sesuai dengan bidang
dynamic_partition_metadata
di manifes pembaruan. Ukuran setiap partisi dapat ditemukan dinew_partition_info
. - Tulis M ke Metadata T.
- Petakan partisi yang ditambahkan pada device mapper sebagai dapat ditulis.
- Bangun metadata M baru dari Metadata S (metadata sumber). Misalnya, jika Metadata S menggunakan [
- Terapkan pembaruan pada perangkat blok.
- Jika perlu, petakan partisi sumber pada device mapper sebagai hanya baca. Ini diperlukan untuk sideloading karena partisi sumber tidak dipetakan sebelum pembaruan.
- Terapkan pembaruan penuh atau delta ke semua perangkat blok di slot target.
- Pasang partisi untuk menjalankan skrip pasca-instal, lalu lepaskan partisi.
- Buka peta partisi target.
Perbarui aliran menggunakan paket pembaruan retrofit
Jika paket pembaruan retrofit diterapkan pada perangkat yang telah mengaktifkan partisi dinamis, klien OTA menerapkan file super.img
terpisah pada perangkat blok secara langsung. Alur pembaruan mirip dengan pembaruan retrofit. Lihat Memasang kembali pembaruan untuk detailnya.
Misalnya, asumsikan berikut ini:
- Slot A adalah slot aktif.
-
system_a
berisi metadata aktif di slot 0. -
vendor_a
system_a
danproduct_a
digunakan sebagai perangkat blok.
Saat klien OTA menerima paket pembaruan retrofit, paket tersebut 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 logis system_b
, vendor_b
, dan product_b
saat boot.
Menghasilkan 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 mendefinisikan variabel, ini adalah pembaruan perkuatan. Paket pembaruan berisi file
super.img
terpisah dan menonaktifkan langkah pasca-instal. - Jika build dasar mendefinisikan variabel, ini sama dengan pembaruan biasa dengan partisi dinamis. Paket pembaruan berisi gambar untuk partisi logis (dinamis). Langkah pasca-instal dapat diaktifkan.
OTA penuh
Dua paket OTA lengkap dibuat untuk perangkat retrofit.
-
$(PRODUCT)-ota-retrofit-$(TAG).zip
selalu berisisuper.img
terpisah dan menonaktifkan langkah pasca-pemasangan untuk pembaruan perkuatan.- Itu dihasilkan dengan argumen tambahan
--retrofit_dynamic_partitions
ke skripota_from_target_files
. - Itu bisa diterapkan ke semua build.
- Itu dihasilkan dengan argumen tambahan
-
$(PRODUCT)-ota-$(TAG).zip
berisi gambar logis untuk pembaruan di masa mendatang.- Terapkan ini hanya untuk bangunan dengan partisi dinamis diaktifkan. Lihat detail di bawah tentang penerapan ini.
Menolak pembaruan non-retrofit pada build lama
Terapkan paket OTA lengkap reguler hanya untuk build dengan partisi dinamis diaktifkan. Jika server OTA tidak dikonfigurasi dengan benar dan mendorong paket ini ke perangkat yang menjalankan Android 9 atau lebih rendah, perangkat gagal untuk boot. 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 meminta langkah pasca-instal untuk memeriksa konfigurasi perangkat yang ada. Sebagai 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 \
Ketika paket OTA biasa diterapkan pada perangkat tanpa partisi dinamis diaktifkan, klien OTA menjalankan check_dynamic_partitions
sebagai langkah pasca-instal dan menolak pembaruan.