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 kaldırabilen bir kullanıcı alanı bölümlendirme sistemi olan dinamik bölümleri destekler.

Bu sayfada, Android 9 ve önceki sürümleri çalıştıran cihazlar için dinamik bölüm desteğiyle kullanıma sunulan A/B 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. Engellenen cihaz, fstab içinde /misc için blk_device girişiyle birlikte bulunmalıdır. Örneğin, fstab dosyası şunları 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ümlerin bilgilerini içerir (genellikle system_s, vendor_s, product_s vb.). 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'den hedef grupları ve bölümleri (örneğin, foo_t, bar_t) kaldırın. Böylece M yalnızca _s sonekine sahip bölümleri ve grupları içerir.
    3. Güncelleme manifest dosyasındaki dynamic_partition_metadata alanına göre hedef gruplar ve bölümler ekleyin.
      Her bölümün boyutu new_partition_info içinde bulunabilir.
    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şleyicideki 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 çıkarı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;
}