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, A/B olmayan cihazlarda güncelleme sırasında OTA istemcilerinin dinamik bölümleri nasıl yeniden boyutlandırdığı açıklanmaktadır.
A/B olmayan cihazlarda dinamik bölümler için OTA güncellemesi, güncelleme paketindeki updater
kullanılarak uygulanır.
Lansman cihazlarını güncelleme
Bu bölüm, dinamik bölüm desteğiyle kullanıma sunulan A/B dışı cihazlar için geçerlidir. Bu cihazlar, Android 10'dan sonraki sürümlere yükseltilir.
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. product
, product_services
veya odm
gibi ek dinamik bölümler varsa bu bölümlerin güncellemeleri cihaza özgü kodda oluşturulmalıdır.
Güncelleme oluşturmak için genişletilmiş Python modülünde FullOTA_GetBlockDifferences()
ve IncrementalOTA_GetBlockDifferences()
işlevlerini 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şlev tarafından döndürülen bölümler manuel olarak değiştirilmemeli veya başka bir yerde (ör. *_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üncelleme
Arka planda, edify 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 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 eşlenmemişse 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)
- Belirtilen işlem listesini dinamik bölüm meta verilerine uygulayın, gerekirse bölümlerin eşlemesini kaldırın.
-
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şlem 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 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 ve 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 adı ve maksimum boyutu olan bir grup ekleyin.
- Grup zaten mevcutsa işlemi iptal edin.
- 0 değerine sahip bir maximum_size, gruptaki bölümlerde boyut sınırı olmadığı anlamına gelir. Gruptaki bölümlerin cihazdaki kullanılabilir alanı aşmaması için ek test yapılması gerekir.
-
resize_group group-name maximum-size
- Grubu belirtilen maksimum boyuta yeniden boyutlandırın.
- Grup mevcut değilse işlemi iptal edin.
- 0 değerine sahip bir maximum_size, gruptaki bölümlerde boyut sınırı olmadığı anlamına gelir. Gruptaki bölümlerin cihazdaki kullanılabilir alanı aşmaması için ek test yapılması gerekir.
remove_group group-name
- Grupları kaldırma
- Grupta bölüm varsa işlemi iptal edin.
remove_all_groups
- Tüm bölümlerin cihaz eşleyiciyle 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:
- Bölümleri küçültme/bölümleri silme/bölümleri gruptan çıkarma (böylece grupları küçültmek için yeterli alan olur)
- Grupları küçültme (grupları büyütmek için yeterli alan olması amacıyla)
- Grupları büyütme (bölümleri büyütmek/eklemek için yeterli alana sahip olabilmemiz amacıyla)
- Bölümleri büyütme/bölüm ekleme/bölümleri yeni gruba taşıma
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:
- Mevcut tüm grupları ve bölümleri silme
- Grup ekleyin
- Bölüm ekleme
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