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

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, dinamik bölüm desteğiyle kullanıma sunulan A/B cihazlarda ve Android 9 ile daha eski sürümleri çalıştıran cihazlarda güncelleme sırasında dinamik bölümlerin nasıl yeniden boyutlandırılacağı açıklanmaktadır.

Arka plan

Cihazda bir super bölümü var. Bu bölüm, yuva sonekli değil. Engelleme cihazı, fstab içinde /misc için blk_device girişiyle birlikte mevcut olmalıdır. Örneğin, fstab dosyası aşağıdakileri listeliyorsa:

/dev/block/bootdevice/by-name/misc    /misc    # Other fields

Ardından, super için blok cihazı /dev/block/bootdevice/by-name/super içinde bulunmalıdır ancak super bölümünün fstab dosyasında listelenmesi gerekmez.

super bölümünde, bölümler için A/B yuvalarına karşılık gelen 0 ve 1 numaralı iki meta veri yuvası vardır. Bu sayfada, meta veri yuvalarına Meta Veri K (kaynak) ve Meta Veri H (hedef) adı verilir. Benzer şekilde, bölümler system_s, vendor_t vb. olarak adlandırılır.

Yükseltmeden önce, Metadata S, kullanılan dinamik bölümlerle ilgili bilgileri (genellikle system_s, vendor_s, product_s vb.) içerir. Sistem, güncelleme sırasında bu bölümlerin kapsamlarını okur. Bu nedenle, bölümler silinemez.

Bölümler, güncelleme gruplarına aittir. Ayrıntılar için Dinamik Bölümleri Uygulama başlıklı makaleyi inceleyin.

Bir cihazdaki meta verilerle ilgili örnek aşağıda verilmiştir.

  • Meta veri 0
    • Grup foo_a
      • system_a bölümü
      • product_services_a bölümü
      • Foo tarafından güncellenen diğer bölümler
    • Grup bar_a
      • vendor_a bölümü
      • product_a bölümü
      • Bard tarafından güncellenen diğer bölümler
    • foo_b grubu (önceki yükseltmeden kalan)
    • bar_b grubu (önceki yükseltmeden kalan)
  • Meta veri 1
    • foo_a grubu (önceki yükseltmeden kalan)
    • bar_a grubu (önceki yükseltmeden kalan)
    • Grup foo_b
      • system_b bölümü
      • product_services_b bölümü
      • Foo tarafından güncellenen diğer bölümler
    • Grup bar_b
      • vendor_b bölümü
      • product_b bölümü
      • Bard tarafından güncellenen diğer bölümler

Cihazınızdaki meta verileri boşaltmak için lpdump aracını (system/extras/partition_tools altındaki kaynak kodu) kullanabilirsiniz. Örneğin:

lpdump --slot 0 /dev/block/bootdevice/by-name/super
lpdump --slot 1 /dev/block/bootdevice/by-name/super

Güncelleme akışı

  1. super bölümü meta verilerini başlatın.
    1. Kaynak dinamik bölümlerin kapsamlarını Metadata S'den yükleyin. Yüklenen meta veriler M olsun.
    2. M'nin yalnızca _s sonekine sahip bölümleri ve grupları içermesi için M'den hedef grupları ve bölümleri (örneğin, foo_t, bar_t) kaldırın.
    3. Güncelleme manifest dosyasındaki dynamic_partition_metadata alanına göre hedef grupları ve bölümleri ekleyin.
      Her bölümün boyutunu new_partition_info içinde bulabilirsiniz.
    4. Write M to Metadata T.
    5. Eklenen bölümleri, cihaz eşleyici üzerinde yazılabilir olarak eşleyin.
  2. Güncellemeyi engellenen cihazlarda uygulayın.
    1. Gerekirse cihaz eşleyici üzerindeki kaynak bölümleri salt okunur olarak eşleyin. Güncellemeden önce kaynak bölümler eşlenmediği için bu, yan yükleme için gereklidir.
    2. Hedef yuvadaki tüm blok cihazlara tam veya delta güncelleme uygular.
    3. Yükleme sonrası komut dosyasını çalıştırmak için bölümleri bağlayın, ardından bölümleri ayırın.
  3. Hedef bölümlerin eşlemesini kaldırın.

Güncellemeden önce ve sonra aşağıdaki sistem özelliklerinin ilgili değerlere sahip olması gerekir:

ro.boot.dynamic_partitions=true
ro.boot.dynamic_partitions_retrofit=true

Güncelleme manifestine gruplar ve bölümler ekleme

Dinamik bölümleri olan bir A/B cihazda veya dinamik bölümler için destek ekleyen bir A/B cihazda OTA güncellemesi yaparken güncelleme manifestine gruplar ve bölümler eklemeniz gerekir. Aşağıdaki snippet, dinamik bölümleri desteklemek için güncelleme manifestiyle ilgili ek bilgileri gösterir. Her alanla ilgili ayrıntılı doküman için update_metadata.proto dosyasına bakın.

message DeltaArchiveManifest {
    optional DynamicPartitionMetadata dynamic_partition_metadata;
}

message DynamicPartitionMetadata {
    repeated DynamicPartitionGroup groups;
}

message DynamicPartitionGroup {
    required string name;
    optional uint64 size; // maximum size of group
    repeated string partition_names;
}