OTA untuk perangkat A/B dengan 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 mengubah ukuran partisi dinamis selama pembaruan untuk perangkat A/B yang diluncurkan dengan dukungan partisi dinamis, untuk perangkat yang menjalankan Android 9 dan lebih rendah .

Latar belakang

Ada satu partisi super di perangkat. Partisi ini tidak dilengkapi slot suffix. Perangkat blok harus ada bersama dengan entri blk_device untuk /misc di fstab . Misalnya, jika file fstab mencantumkan:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

Maka perangkat blok untuk super harus ada di /dev/block/bootdevice/by-name/super , tetapi partisi super tidak perlu dicantumkan di file fstab .

Di partisi super , terdapat dua slot metadata , bernomor 0 dan 1, 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 pemutakhiran, Metadata S berisi informasi untuk partisi dinamis yang digunakan (biasanya, system_s , vendor_s , product_s , dan seterusnya). Sistem membaca luasan partisi ini selama pembaruan, sehingga tidak dapat dihapus.

Partisi milik grup pembaruan . Lihat Menerapkan Partisi Dinamis untuk detailnya.

Contoh metadata pada suatu perangkat adalah sebagai berikut.

  • Metadata 0
    • Grup foo_a
      • system_a partisi_a
      • Partisi product_services_a
      • Partisi lain diperbarui oleh Foo
    • Grup bar_a
      • vendor_a partisi_a
      • product_a partisi_a
      • Partisi lain diperbarui oleh Bar
    • Grup foo_b (sisa dari peningkatan sebelumnya)
    • Grup bar_b (sisa dari peningkatan sebelumnya)
  • Metadata 1
    • Grup foo_a (sisa dari peningkatan sebelumnya)
    • Grup bar_a (sisa dari peningkatan sebelumnya)
    • Grup foo_b
      • system_b partisi_b
      • Partisi product_services_b
      • Partisi lain diperbarui oleh Foo
    • Grup bar_b
      • vendor_b partisi_b
      • product_b partisi_b
      • Partisi lain diperbarui oleh Bar

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

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Aliran pembaruan

  1. Inisialisasi metadata partisi super .
    1. Muat luasan partisi dinamis sumber dari Metadata S. Biarkan M menjadi metadata yang dimuat.
    2. Hapus grup dan partisi target (misalnya, foo_t , bar_t ) dari M sehingga M hanya berisi partisi dan grup dengan akhiran _s .
    3. Tambahkan grup target dan partisi sesuai dengan bidang dynamic_partition_metadata di manifes pembaruan.
      Ukuran setiap partisi dapat ditemukan di new_partition_info .
    4. Tulis M ke Metadata T.
    5. 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.

Sebelum dan sesudah pembaruan, properti sistem berikut harus memiliki nilai masing-masing:

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

Tambahkan grup dan partisi ke manifes pembaruan

Saat melakukan pembaruan 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 pembaruan. Cuplikan di bawah ini menunjukkan informasi tambahan tentang manifes pembaruan untuk mendukung partisi dinamis. Lihat update_metadata.proto untuk dokumentasi detail pada setiap bidang.

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;
}