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

Android 10, kablosuz güncellemeler sırasında bölümler oluşturabilen, yeniden boyutlandırabilen ve yok edebilen bir kullanıcı alanı bölümlendirme sistemi olan dinamik bölümleri destekler.

Bu sayfada, dinamik bölüm desteğiyle kullanıma sunulan A/B cihazlar ve Android 9 ve önceki sürümleri çalıştıran cihazlar için 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üme ek olarak ek bir slot eklenmemiştir. Blok cihazı, fstab içindeki /misc için blk_device girişiyle birlikte bulunmalıdır. Örneğin, fstab dosyası aşağıdakileri listelerse:

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

Bu durumda, super için blok cihaz /dev/block/bootdevice/by-name/super'te bulunmalıdır ancak super bölümünün fstab dosyasında listelenmesine gerek yoktur.

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

Yükseltme işleminden önce Meta Veri S, kullanılan dinamik bölümlerle ilgili bilgileri içerir (genellikle system_s, vendor_s, product_s vb.). Sistem, güncelleme sırasında bu bölümlerin kapsamını okuduğu için silinemez.

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

Bir cihazdaki meta verilere örnek olarak aşağıdakiler verilebilir.

  • Meta veri 0
    • Grup foo_a
      • Bölüm system_a
      • Bölüm product_services_a
      • Foo tarafından güncellenen diğer bölümler
    • Grup bar_a
      • Bölüm vendor_a
      • Bölüm product_a
      • Bar 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)
    • Grup bar_a (önceki yükseltmeden kalan)
    • Grup foo_b
      • Bölüm system_b
      • Bölüm product_services_b
      • Foo tarafından güncellenen diğer bölümler
    • Grup bar_b
      • Bölüm vendor_b
      • Bölüm product_b
      • Çubuk tarafından güncellenen diğer bölümler

Cihazınızdaki meta verileri dökmek için lpdump aracını (system/extras/partition_tools altındaki kaynak kod) kullanabilirsiniz. Örnek:

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

Akışı güncelleme

  1. super bölüm meta verilerini başlatın.
    1. Kaynak dinamik bölümlerinin kapsamlarını Meta Veriler'den yükleyin. M, yüklenen meta veri olsun.
    2. M yalnızca _s son eki olan bölümleri ve grupları içerecek şekilde M'den hedef grupları ve bölümleri (örneğin, foo_t, bar_t) kaldırın.
    3. Güncelleme manifestindeki 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. M'yi T meta verilerine yazın.
    5. Eklenen bölümleri cihaz eşleyicide yazılabilir olarak eşleyin.
  2. Güncellemeyi engellenen cihazlara uygulayın.
    1. Gerekirse cihaz eşleyicideki kaynak bölümlerini salt okunur olarak eşleyin. Kaynak bölümleri güncelleme öncesinde eşlenmediğinden bu, başka cihazdan yükleme işlemi için gereklidir.
    2. Hedef yuvasındaki tüm engelleme cihazlarına tam veya delta güncellemesi uygulayın.
    3. Yükleme sonrası komut dosyasını çalıştırmak için bölümleri monte edin ve ardından bölümlerin montesini kaldırın.
  3. Hedef bölümlerin eşlemesini kaldırın.

Aşağıdaki sistem özellikleri, güncellemeden önce ve sonra ilgili değerlere sahip olmalıdır:

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

Güncelleme manifest dosyasına grup ve bölüm ekleme

Dinamik bölümlere sahip bir A/B cihazda veya dinamik bölümler için destek ekleyen bir A/B cihazda OTA güncellemesi yaparken güncelleme manifest dosyasına grup ve bölüm eklemeniz gerekir. Aşağıdaki snippet'te, dinamik bölümleri desteklemek için güncelleme manifest'iyle ilgili ek bilgiler gösterilmektedir. Her alanla ilgili ayrıntılı dokümanlar 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;
}