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

Android 10, kablosuz (OTA) güncellemeler sırasında bölüm oluşturabilen, yeniden boyutlandırabilen ve bölüm silebilir 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üm, alan sonekine sahip değil. Engelleme cihazı, fstab'de /misc için blk_device girişiyle birlikte 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 şurada bulunmalıdır: /dev/block/bootdevice/by-name/super, ancak super bölümünün fstab dosyası.

super bölümünde iki 0 ve 1 numaralı meta veri alanları, Bölümler için A/B yuvaları. Bu sayfada meta veri alanları Meta Veri S (kaynak) ve Meta Veri T (hedef) olarak adlandırılır. Benzer şekilde, bölümlere system_s, vendor_t vb. adlar verilir.

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

Bölümler güncelleme gruplarına aittir. Görüntüleyin Uygulamanın Dynamic Partitions (Dinamik Bölümler) bölümüne göz atın.

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 çubuğu_a
      • Bölüm vendor_a
      • Bölüm product_a
      • Bar tarafından güncellenen diğer bölümler
    • Grup foo_b (önceki yükseltmeden kalan)
    • Grup bar_b (önceki yükseltmeden kalan)
  • Meta veri 1
    • Grup foo_a (önceki yükseltmeden kalan)
    • bar_a grubu (ö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

lpdump aracını kullanabilirsiniz (kaynak kodu system/extras/partition_tools) tıklayın. en iyi yoludur. Ö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. Hedef grupları ve bölümleri kaldırın (örneğin, foo_t, bar_t) kaldırın. yalnızca _s son ekini içeren bölümler ve gruplar.
    3. Güncelleme manifestindeki dynamic_partition_metadata alanına göre hedef gruplar ve bölümler ekleyin.
      Her bölümün boyutunu new_partition_info'da bulabilirsiniz.
    4. M'ye Meta Veri T'ye yazma.
    5. Eklenen bölümleri cihaz eşleyicide yazılabilir olarak eşleyin.
  2. Güncellemeyi engelleme cihazlarına uygulayın.
    1. Gerekirse cihaz eşleyicide kaynak bölümleri salt okunur olarak eşleyin. Kaynak bölümleri güncellemeden önce eşlenmediği için bu, yan yükleme için gereklidir.
    2. Hedefteki tüm engellenen cihazlara tam veya delta güncellemesi uygula yuvaya yerleştirilmiştir.
    3. Yükleme sonrası komut dosyasını çalıştırmak için bölümleri ekleyin ve bölümleri 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 manifestine grup ve bölüm ekle

Dinamik bölümlendirmelere sahip bir A/B cihazında OTA güncellemesi gerçekleştirirken veya dinamik bölümler için destek ekleyen bir A/B cihazına bağlı olarak güncelleme manifest dosyasına gruplar ve bölümler eklemeniz gerekir. Snippet aşağıda listelenen desteği desteklemek için güncelleme manifest'inde dinamik bölümlerle gösterilir. 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;
}