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 non-A/B.
Untuk perangkat non-A/B, pembaruan OTA untuk partisi dinamis diterapkan menggunakan updater
di dalam paket pembaruan.
Perbarui perangkat peluncuran
Bagian ini berlaku untuk perangkat non-A/B yang diluncurkan dengan dukungan partisi dinamis; perangkat ini ditingkatkan dari Android 10 ke rilis yang lebih tinggi.
Hasilkan paket pembaruan
Paket pembaruan OTA dihasilkan oleh skrip ota_from_target_files
, yang terletak di bawah build/make/tools/releasetools
. Secara default, skrip menghasilkan paket yang memperbarui partisi system
dan vendor
. Jika ada partisi dinamis tambahan, seperti product
, product_services
, atau odm
, pembaruannya harus dibuat dalam kode khusus perangkat .
Untuk menghasilkan pembaruan, dalam modul Python yang diperluas, implementasikan FullOTA_GetBlockDifferences()
dan IncrementalOTA_GetBlockDifferences()
. Kedua fungsi ini mengembalikan daftar objek BlockDifference
, masing-masing menjelaskan patch pembaruan yang akan diterapkan pada partisi. Partisi yang dikembalikan oleh kedua fungsi ini tidak boleh diubah secara manual atau diverifikasi di tempat lain, misalnya di *_InstallBegin()
atau *_InstallEnd()
.
Contoh pembuatan pembaruan:
# device/yoyodyne/tardis/releasetools.py import os from common import BlockDifference, EmptyImage, GetUserImage # The joined list of user image partitions of source and target builds. # - Items should be added to the list if new dynamic partitions are added. # - Items should not be removed from the list even if dynamic partitions are # deleted. When generating an incremental OTA package, this script needs to # know that an image is present in source build but not in target build. USERIMAGE_PARTITIONS = [ "product", "odm", ] def GetUserImages(input_tmp, input_zip): return {partition: GetUserImage(partition, input_tmp, input_zip) for partition in USERIMAGE_PARTITIONS if os.path.exists(os.path.join(input_tmp, "IMAGES", partition + ".img"))} def FullOTA_GetBlockDifferences(info): images = GetUserImages(info.input_tmp, info.input_zip) return [BlockDifference(partition, image) for partition, image in images.items()] def IncrementalOTA_GetBlockDifferences(info): source_images = GetUserImages(info.source_tmp, info.source_zip) target_images = GetUserImages(info.target_tmp, info.target_zip) # Use EmptyImage() as a placeholder for partitions that will be deleted. for partition in source_images: target_images.setdefault(partition, EmptyImage()) # Use source_images.get() because new partitions are not in source_images. return [BlockDifference(partition, target_image, source_images.get(partition)) for partition, target_image in target_images.items()]
Aliran pembaruan
Di balik layar, fungsi-fungsi berikut ditambahkan ke skrip edify:
-
unmap_partition(name)
- Hapus peta partisi jika dipetakan, jika tidak, jangan lakukan apa pun.
- Kembalikan string
t
jika berhasil, atau string kosong jika gagal.
-
map_partition(name)
- Petakan partisi jika belum dipetakan.
- Kembalikan jalur absolut perangkat blok yang dipetakan jika berhasil, atau string kosong jika gagal.
-
update_dynamic_partitions(op_list)
- Terapkan daftar operasi yang diberikan pada metadata partisi dinamis, hapus pemetaan partisi jika perlu.
- Kembalikan
t
jika berhasil, atau string kosong jika gagal.
Argumen op_list
pada update_dynamic_partitions
menunjuk ke file dalam paket pembaruan. Setiap baris dalam file menentukan operasi. Jika ada operasi yang gagal, update_dynamic_partitions
segera mengembalikan string kosong. Operasinya adalah:
-
resize partition-name size
- Hapus peta partisi, lalu ubah ukurannya menjadi size .
-
remove partition_name
- Hapus peta partisi, lalu hapus.
-
add partition-name group-name
- Tambahkan partisi baru ke grup yang ditentukan.
- Batalkan jika grup tidak ada atau jika partisi sudah ada.
-
move partition-name group-name
- Pindahkan partisi ke grup yang ditentukan.
- Batalkan jika grup tidak ada atau partisi tidak ada.
-
add_group group-name maximum-size
- Tambahkan grup dengan nama tertentu dan ukuran maksimum.
- Batalkan jika grup sudah ada.
- maximum_size 0 berarti tidak ada batasan ukuran pada partisi dalam grup. Pengujian tambahan diperlukan untuk memastikan bahwa partisi dalam grup tidak melebihi ruang yang tersedia di perangkat.
-
resize_group group-name maximum-size
- Ubah ukuran grup ke ukuran maksimum yang diberikan.
- Batalkan jika grup tidak ada.
- maximum_size 0 berarti tidak ada batasan ukuran pada partisi dalam grup. Pengujian tambahan diperlukan untuk memastikan bahwa partisi dalam grup tidak melebihi ruang yang tersedia di perangkat.
-
remove_group group-name
- Hapus grup.
- Batalkan jika ada partisi dalam grup.
-
remove_all_groups
- Hapus peta semua partisi dari pemeta perangkat.
- Hapus semua partisi dan grup.
OTA tambahan
Pembaruan OTA tambahan menggunakan logika berikut:
- Kecilkan partisi/hapus partisi/pindahkan partisi keluar grup (sehingga ada cukup ruang untuk mengecilkan grup)
- Perkecil kelompok (sehingga ada cukup ruang untuk mengembangkan kelompok)
- Kembangkan grup (sehingga kita memiliki cukup ruang untuk mengembangkan/menambah partisi)
- Kembangkan partisi/tambah partisi/pindahkan partisi ke grup baru
Secara detail, update-script
dibuat dengan logika ini:
for each shrinking partition: block_image_update(map_partition(name), …) update_dynamic_partitions(op_list) for each growing / adding partition: block_image_update(map_partition(name), …)
File op_list
untuk update_dynamic_partitions
dibuat dengan logika ini:
for each deleting partition: remove for each partition that changes groups: move to "default" for each shrinking partition: resize for each shrinking / removing group: resize_group / remove_group for each growing / adding group: resize_group / add_group for each adding partition: add for each growing / adding partition: resize for each partition that changes groups: move to target group
OTA penuh
Pembaruan OTA penuh menggunakan logika berikut:
- Hapus semua grup dan partisi yang ada
- Tambahkan grup
- Tambahkan partisi
Secara detail, update-script
dibuat dengan logika ini:
update_dynamic_partitions(op_list) for each adding partition: block_image_update(map_partition(name), …)
File op_list
untuk update_dynamic_partitions
dibuat dengan logika ini:
remove_all_groups for each adding group: add_group for each adding partition: add for each adding partition: resize