OTA untuk perangkat non-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 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:

  1. Kecilkan partisi/hapus partisi/pindahkan partisi keluar grup (sehingga ada cukup ruang untuk mengecilkan grup)
  2. Perkecil kelompok (sehingga ada cukup ruang untuk mengembangkan kelompok)
  3. Kembangkan grup (sehingga kita memiliki cukup ruang untuk mengembangkan/menambah partisi)
  4. 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:

  1. Hapus semua grup dan partisi yang ada
  2. Tambahkan grup
  3. 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