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

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

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

A/B olmayan cihazlar için dinamik bölümlere yönelik OTA güncellemesi, güncelleme paketinin içindeki updater kullanılarak uygulanır.

Başlatma cihazlarını güncelleyin

Bu bölüm, dinamik bölüm desteğiyle başlatılan A/B olmayan cihazlar için geçerlidir; bu cihazlar Android 10'dan daha yüksek sürümlere yükseltilir.

Güncelleme paketleri oluştur

OTA güncelleme paketleri build/make/tools/releasetools altında bulunan ota_from_target_files betiği tarafından oluşturulur. Varsayılan olarak komut dosyası, system ve vendor bölümlerini güncelleyen bir paket oluşturur. product , product_services veya odm gibi ek dinamik bölümler varsa, bunların güncellemeleri cihaza özel kodda oluşturulmalıdır.

Güncellemeler oluşturmak için genişletilmiş Python modülünde FullOTA_GetBlockDifferences() ve IncrementalOTA_GetBlockDifferences() ı uygulayın. 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şlevin döndürdüğü bölümler manuel olarak değiştirilmemeli veya başka bir yerde (örneğin *_InstallBegin() veya *_InstallEnd() doğrulanmamalıdır.

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üncelle

Perde arkasında düzenleme komut dosyasına aşağıdaki işlevler eklenir:

  • unmap_partition(name)
    • Eşlenmişse bölümün eşlemesini kaldırın, aksi halde hiçbir şey yapmayın.
    • Başarı durumunda t dizesini veya başarısızlık durumunda boş bir dizeyi döndürün.
  • map_partition(name)
    • Henüz eşlenmemişse bölümü eşleyin.
    • Başarı durumunda eşlenen blok aygıtının mutlak yolunu veya başarısızlık durumunda boş bir dizeyi döndürün.
  • update_dynamic_partitions(op_list)
    • Verilen işlem listesini dinamik bölüm meta verilerine uygulayın ve gerekirse bölümlerin eşlemesini kaldırın.
    • Başarı durumunda t , başarısızlık durumunda ise boş bir dizeyi döndürün.

update_dynamic_partitions op_list argümanı, güncelleme paketindeki bir dosyaya işaret eder. Dosyadaki her satır bir işlemi belirtir. Herhangi bir işlem başarısız olursa update_dynamic_partitions hemen boş bir dize döndürür. İşlemler şunlardır:

  • resize partition-name size
    • Bölümün eşlemesini kaldırın ve ardından size göre yeniden boyutlandırın.
  • remove partition_name
    • Bölümün eşlemesini kaldırın ve ardından kaldırın.
  • add partition-name group-name
    • Belirtilen gruba yeni bir bölüm ekleyin.
    • Grup mevcut değilse veya bölüm zaten mevcutsa iptal edin.
  • move partition-name group-name
    • Bölümü belirtilen gruba taşıyın.
    • Grup mevcut değilse veya bölüm mevcut değilse iptal edin.
  • add_group group-name maximum-size
    • Belirtilen ada ve maksimum boyuta sahip bir grup ekleyin.
    • Grup zaten mevcutsa iptal edin.
    • maximum_size 0 değeri, gruptaki bölümlerde boyut sınırı olmadığı anlamına gelir. Gruptaki bölümlerin cihazdaki kullanılabilir alanı aşmadığından emin olmak için ek testler gereklidir.
  • resize_group group-name maximum-size
    • Grubu verilen maksimum boyuta göre yeniden boyutlandırın.
    • Grup mevcut değilse iptal edin.
    • maximum_size 0 değeri, gruptaki bölümlerde boyut sınırı olmadığı anlamına gelir. Gruptaki bölümlerin cihazdaki kullanılabilir alanı aşmadığından emin olmak için ek testler gereklidir.
  • remove_group group-name
    • Bir grubu kaldırın.
    • Grupta bölümler varsa iptal edin.
  • remove_all_groups
    • Cihaz eşleyiciden 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üçültün/bölümleri silin/bölümleri gruptan çıkarın (böylece grupları küçültmek için yeterli alan olur)
  2. Grupları küçültün (böylece grupları büyütmek için yeterli alan olur)
  3. Grupları büyütün (böylece bölümleri büyütmek/eklemek için yeterli alana sahip oluruz)
  4. Bölümleri büyütün/bölümler ekleyin/bölümleri yeni gruba taşıyın

Ayrıntılı olarak update-script şu mantıkla oluşturulur:

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 silin
  2. Grup ekle
  3. Bölüm ekle

Ayrıntılı olarak update-script şu mantıkla oluşturulur:

update_dynamic_partitions(op_list)

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

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

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