Dinamik bölümlere sahip A/B olmayan cihazlar için OTA

Android 10, kablosuz (OTA) güncellemeler sırasında bölüm oluşturabilen, yeniden boyutlandırabilen ve bölüm silebilir bir kullanıcı alanı bölümlendirme sistemi olan dinamik bölümleri destekler.

Bu sayfada, OTA istemcilerinin bir güncelleme sırasında dinamik bölümleri nasıl yeniden boyutlandırdığı açıklanmaktadır A/B olmayan cihazlar.

A/B olmayan cihazlarda dinamik bölümler için OTA güncellemesi uygulanır (Güncelleme paketinin içindeki updater öğesini kullanarak).

Lansman cihazlarını güncelleme

Bu bölüm, dinamik sürümle başlatılan A/B olmayan cihazlar için geçerlidir. bölüm desteği; bu cihazlar Android'den yeni sürüme geçiriliyor 10 ila daha yüksek sürümler.

Güncelleme paketleri oluşturma

OTA güncelleme paketleri, build/make/tools/releasetools altındaki ota_from_target_files komut dosyası tarafından oluşturulur. Komut dosyası varsayılan olarak system ve vendor bölümlerini güncelleyen bir paket oluşturur. Ek dinamikler varsa product gibi bölümler, product_services veya odm, güncellemelerin oluşturulması için cihaza özgü kodu.

Güncelleme oluşturmak için genişletilmiş Python modülünde FullOTA_GetBlockDifferences() ve IncrementalOTA_GetBlockDifferences(). Bu iki işlev, her biri bir bölüme uygulanacak güncelleme yamasını açıklayan BlockDifference nesnelerinin bir listesini döndürür. Bu iki işlev tarafından döndürülen bölümler manuel olarak değiştirilmiş veya başka bir yerde doğrulanmış durumda, örneğin *_InstallBegin() veya *_InstallEnd().

Güncelleme oluşturma örneği:

# 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()]

Akışı güncelleme

Arka planda, edify komut dosyasına aşağıdaki işlevler eklenir:

  • unmap_partition(name)
    • Haritalanmışsa bölümün haritasını kaldırın, aksi takdirde hiçbir işlem yapmayın.
    • Başarılı olduğunda t dizesini, başarısız olduğunda ise boş bir dizeyi döndürür.
  • map_partition(name)
    • Henüz haritalandırılmamışsa bölümü eşleyin.
    • Başarılı olduğunda eşlenen blok cihazın mutlak yolunu, başarısız olduğunda ise boş bir dize döndürür.
  • update_dynamic_partitions(op_list)
    • Verilen işlem listesini dinamik bölüm meta verilerine uygulayın. bölümlerin eşlemesini kaldırma.
    • Başarılı olduğunda t, başarısız olduğunda boş bir dize döndürür.

update_dynamic_partitions işlevinin op_list bağımsız değişkeni, güncelleme paketindeki bir dosyayı gösterir. Dosyadaki her satır bir işlemi belirtir. Varsa işlem başarısız olur, update_dynamic_partitions hemen boş bir dize döndürür. İşlemler şunlardır:

  • resize partition-name size
    • Bölümün haritasını kaldırın ve ardından size olarak yeniden boyutlandırın.
  • remove partition_name
    • Bölümün haritasını kaldırın, ardından bölümü kaldırın.
  • add partition-name group-name
    • Belirtilen gruba yeni bir bölüm ekleyin.
    • Grup yoksa veya bölüm zaten mevcutsa işlemi iptal edin.
  • move partition-name group-name
    • Bölme, belirtilen gruba taşınır.
    • Grup veya bölüm mevcut değilse işlemi iptal edin.
  • add_group group-name maximum-size
    • Belirtilen ada ve maksimum boyuta sahip bir grup ekleyin.
    • Grup zaten mevcutsa iptal et.
    • maximum_size değeri 0 ise gruptaki bölümlerde boyut sınırı yoktur. Gruptaki bölümlerin cihazdaki kullanılabilir alanı aşmaması için ek test yapılması gerekir.
  • resize_group group-name maximum-size
    • Grubu verilen maksimum boyuta göre yeniden boyutlandırın.
    • Grup yoksa iptal edin.
    • maximum_size değerinin 0 olması boyut sınırı olmadığı anlamına gelir fark edebilirsiniz. Ek test durumunda Gruptaki bölümlerin kullanılabilir alana sahip olmanız gerekir.
  • remove_group group-name
    • Grupları kaldırabilirsiniz.
    • Grupta bölüm varsa işlemi iptal edin.
  • remove_all_groups
    • Cihaz eşleyicisinden tüm bölümlerin eşlemesini kaldırın.
    • Tüm bölümleri ve grupları kaldırın.

Artımlı OTA

Artımlı OTA güncellemeleri aşağıdaki mantığı kullanır:

  1. Bölümleri küçültme/bölümleri silme/bölümleri gruptan çıkarma (böylece grupları küçültmek için yeterli alan olur)
  2. Grupları küçültme (grupları büyütmek için yeterli alan olması amacıyla)
  3. Grupları büyütün (böylece, büyümek/eklemek için yeterli alanımız olur.) bölümler)
  4. Bölümleri büyütme/bölüm ekleme/yeni gruba bölüm taşıma

Ayrıntılı olarak update-script, bununla birlikte oluşturulur mantık:

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), …)

update_dynamic_partitions için op_list dosyası şu mantıkla oluşturulur:

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

Tam OTA

Tam OTA güncellemeleri aşağıdaki mantığı kullanır:

  1. Mevcut tüm grupları ve bölümleri silme
  2. Grup ekleyin
  3. Bölüm ekleme

Ayrıntılı olarak update-script, bununla birlikte oluşturulur mantık:

update_dynamic_partitions(op_list)

for each adding partition:
    block_image_update(map_partition(name), …)

op_list dosyası update_dynamic_partitions bununla elde edildi mantık:

remove_all_groups
for each adding group:
    add_group
for each adding partition:
    add
for each adding partition:
    resize