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:
- 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)
- Grupları küçültün (böylece grupları büyütmek için yeterli alan olur)
- Grupları büyütün (böylece bölümleri büyütmek/eklemek için yeterli alana sahip oluruz)
- 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:
- Mevcut tüm grupları ve bölümleri silin
- Grup ekle
- 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