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 mengubah ukuran partisi dinamis selama update untuk perangkat A/B yang diluncurkan dengan dukungan partisi dinamis, untuk perangkat yang menjalankan Android 9 dan yang lebih lama.
Latar belakang
Ada satu partisi super
di perangkat. Partisi
ini tidak diberi akhiran slot. Perangkat blok harus ada bersama
entri blk_device
untuk /misc
di
fstab
. Misalnya, jika file fstab
mencantumkan:
/dev/block/bootdevice/by-name/misc /misc # Other fields
Kemudian, perangkat blok untuk super
harus ada di
/dev/block/bootdevice/by-name/super
, tetapi
partisi super
tidak perlu dicantumkan dalam
file fstab
.
Di partisi super
, ada dua
slot metadata, bernomer 0 dan 1, yang sesuai dengan
slot A/B untuk partisi. Di halaman ini, slot metadata
disebut Metadata S (sumber) dan Metadata T (target). Demikian pula,
partisi disebut sebagai system_s
,
vendor_t
, dan seterusnya.
Sebelum upgrade, Metadata S berisi informasi untuk
partisi dinamis yang digunakan (biasanya, system_s
,
vendor_s
, product_s
, dan sebagainya). Sistem
membaca extent untuk partisi ini selama update, sehingga
partisi tersebut tidak dapat dihapus.
Partisi termasuk dalam grup update. Lihat Menerapkan Partisi Dinamis untuk mengetahui detailnya.
Contoh metadata di perangkat adalah sebagai berikut.
- Metadata 0
- Grup
foo_a
- Partisi
system_a
- Partisi
product_services_a
- Partisi lain yang diperbarui oleh Foo
- Partisi
- Bar_a grup
- Partisi
vendor_a
- Partisi
product_a
- Partisi lain yang diperbarui oleh Panel
- Partisi
- Grup
foo_b
(sisa dari upgrade sebelumnya) - Grup
bar_b
(sisa dari upgrade sebelumnya)
- Grup
- Metadata 1
- Grup
foo_a
(sisa dari upgrade sebelumnya) - Grup
bar_a
(sisa dari upgrade sebelumnya) - Grup
foo_b
- Partisi
system_b
- Partisi
product_services_b
- Partisi lain yang diperbarui oleh Foo
- Partisi
- Grup
bar_b
- Partisi
vendor_b
- Partisi
product_b
- Partisi lain yang diperbarui oleh Panel
- Partisi
- Grup
Anda dapat menggunakan alat lpdump
(kode sumber di
system/extras/partition_tools
) untuk membuang metadata di
perangkat Anda. Contoh:
lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super
Memperbarui alur
- Lakukan inisialisasi metadata partisi
super
.- Muat ekstensi untuk partisi dinamis sumber dari Metadata S. Misalkan M adalah metadata yang dimuat.
-
Hapus grup dan partisi target (misalnya,
foo_t
,bar_t
) dari M sehingga M hanya berisi partisi dan grup dengan akhiran_s
. -
Tambahkan grup dan partisi target sesuai dengan
kolom
dynamic_partition_metadata
dalam manifes update.
Ukuran setiap partisi dapat ditemukan dinew_partition_info
. - Tulis M ke Metadata T.
- Petakan partisi yang ditambahkan di pemetaan perangkat sebagai dapat ditulis.
- Terapkan update pada perangkat blok.
- Jika perlu, petakan partisi sumber di pemetaan perangkat sebagai hanya baca. Hal ini diperlukan untuk sideload 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.
Sebelum dan sesudah update, properti sistem berikut harus memiliki nilai masing-masing:
ro.boot.dynamic_partitions=true ro.boot.dynamic_partitions_retrofit=true
Menambahkan grup dan partisi ke manifes update
Saat melakukan update OTA pada perangkat A/B dengan partisi dinamis, atau perangkat A/B yang menambahkan dukungan untuk partisi dinamis, Anda perlu menambahkan grup dan partisi ke manifes update. Cuplikan di bawah menunjukkan informasi tambahan tentang manifes update untuk mendukung partisi dinamis. Lihat update_metadata.proto untuk dokumentasi mendetail tentang setiap kolom.
message DeltaArchiveManifest { optional DynamicPartitionMetadata dynamic_partition_metadata; } message DynamicPartitionMetadata { repeated DynamicPartitionGroup groups; } message DynamicPartitionGroup { required string name; optional uint64 size; // maximum size of group repeated string partition_names; }