Android 10, kablosuz (OTA) güncellemeleri 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, OTA istemcilerinin A/B olmayan cihazlarda güncelleme sırasında 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 paketinin içindeki 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 olmayan cihazlar için geçerlidir. Bu cihazlar, Android 10'dan daha yeni sürümlere yükseltilir.
Güncelleme paketleri oluşturma
OTA güncelleme paketleri, ota_from_target_files
komut dosyası tarafından oluşturulur. Bu komut dosyası, build/make/tools/releasetools
altında yer alır. 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 kod olarak oluşturulmalıdır.
Güncelleme oluşturmak için genişletilmiş Python modülünde FullOTA_GetBlockDifferences()
ve IncrementalOTA_GetBlockDifferences()
öğelerini uygulayın. Bu iki işlev, her biri bir bölüme uygulanacak güncelleme yamasını açıklayan BlockDifference
nesnelerinin 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()
ya da *_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()]
Güncelleme akışı
Arka planda, edify komut dosyasına aşağıdaki işlevler eklenir:
unmap_partition(name)
- Bölüm eşlenmişse eşlemeyi kaldırın, aksi takdirde herhangi bir işlem yapmayın.
- Başarılı olursa
t
dizesini, başarısız olursa boş dizeyi döndürür.
map_partition(name)
- Henüz eşlenmemişse bölümü eşleyin.
- Başarılı olursa eşlenen blok cihazın mutlak yolunu, başarısız olursa boş bir dizeyi döndürür.
update_dynamic_partitions(op_list)
- Gerekirse bölümleri eşlemesini kaldırarak, verilen işlem listesini dinamik bölüm meta verilerine uygulayın.
-
Başarı durumunda
t
, başarısızlık durumunda ise boş bir dize döndürür.
op_list
bağımsız değişkeni, update_dynamic_partitions
güncelleme paketindeki bir dosyayı gösterir. 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 size olarak yeniden boyutlandırın.
remove partition_name
- Bölümün eşlemesini 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 varsa işlemi durdurun.
move partition-name group-name
- Bölümü belirtilen gruba taşıyın.
- Grup veya bölüm mevcut değilse işlemi durdurun.
-
add_group group-name maximum-size
- Belirtilen ad ve maksimum boyuta sahip bir grup ekleyin.
- Grup zaten varsa işlemi iptal edin.
- 0 maximum_size değeri, gruptaki bölümler için boyut sınırı olmadığını gösterir. Gruptaki bölümlerin cihazda bulunan alanı aşmadığından emin olmak için ek test yapılması gerekir.
-
resize_group group-name maximum-size
- Grubu belirtilen maksimum boyuta göre yeniden boyutlandırın.
- Grup yoksa işlemi durdurun.
- 0 maximum_size değeri, gruptaki bölümler için boyut sınırı olmadığını gösterir. Gruptaki bölümlerin cihazda bulunan alanı aşmadığından emin olmak için ek test yapılması gerekir.
remove_group group-name
- Grubu kaldırma
- Grupta bölümler varsa işlemi durdurun.
remove_all_groups
- Tüm bölümleri cihaz eşleyiciden 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 grup dışına taşıma (grupları küçültmek için yeterli alan olması gerekir)
- Grupları küçültme (böylece grupların büyümesi için yeterli alan olur)
- Grupları büyütme (böylece bölümleri büyütmek/eklemek için yeterli alanımız olur)
- 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), …)
op_list
için update_dynamic_partitions
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 OSA
Tam OTA güncellemeleri aşağıdaki mantığı kullanır:
- Mevcut tüm grupları ve bölümleri silin.
- 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), …)
op_list
için update_dynamic_partitions
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