التحديث عبر الهواء لأجهزة A/B التي تتضمّن أقسامًا ديناميكية

يتوافق نظام التشغيل Android 10 مع الأقسام الديناميكية، وهو نظام تقسيم لمساحة المستخدم يتيح إنشاء الأقسام وتغيير حجمها وإزالتها أثناء إجراء التحديثات عبر الهواء (OTA).

توضّح هذه الصفحة كيفية تغيير حجم الأقسام الديناميكية أثناء التحديث لأجهزة A/B التي تم إطلاقها مع إتاحة الأقسام الديناميكية، وذلك للأجهزة التي تعمل بنظام التشغيل Android 9 والإصدارات الأقدم.

خلفية

يتضمّن الجهاز قسمًا واحدًا super. هذا القسم غير لاحق بلاحقة فتحة البطاقة. يجب أن يكون جهاز الحظر موجودًا مع الإدخال blk_device الخاص بـ /misc في fstab. على سبيل المثال، إذا كان ملف fstab يتضمّن ما يلي:

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

بعد ذلك، يجب أن يكون جهاز الحظر الخاص بـ super متوفّرًا في /dev/block/bootdevice/by-name/super، ولكن ليس من الضروري إدراج قسم super في ملف fstab.

في القسم super، هناك خانتا بيانات وصفية، مرقّمتان بـ 0 و1، وهما تتوافقان مع خانتَي اختبار أ/ب للأقسام. في هذه الصفحة، يُطلق على خانات البيانات الوصفية اسم "البيانات الوصفية S (المصدر)" و"البيانات الوصفية T (الهدف)". وبالمثل، يُشار إلى الأقسام باسم system_s وvendor_t وما إلى ذلك.

قبل الترقية، يحتوي Metadata S على معلومات الأقسام الديناميكية المستخدَمة (عادةً، system_s وvendor_s وproduct_s وما إلى ذلك). يقرأ النظام نطاقات هذه الأقسام أثناء التحديث، لذا لا يمكن حذفها.

تنتمي الأقسام إلى مجموعات التحديث. لمزيد من التفاصيل، يُرجى الاطّلاع على تنفيذ الأقسام الديناميكية.

في ما يلي مثال على البيانات الوصفية على جهاز:

  • البيانات الوصفية 0
    • المجموعة foo_a
      • القسم system_a
      • القسم product_services_a
      • الأقسام الأخرى التي عدّلها Foo
    • Group bar_a
      • القسم vendor_a
      • القسم product_a
      • الأقسام الأخرى التي عدّلها Bar
    • المجموعة foo_b (متبقية من الترقية السابقة)
    • المجموعة bar_b (متبقية من الترقية السابقة)
  • البيانات الوصفية 1
    • المجموعة foo_a (متبقية من الترقية السابقة)
    • المجموعة bar_a (متبقية من الترقية السابقة)
    • المجموعة foo_b
      • القسم system_b
      • القسم product_services_b
      • الأقسام الأخرى التي عدّلها Foo
    • المجموعة bar_b
      • القسم vendor_b
      • القسم product_b
      • الأقسام الأخرى التي عدّلها Bar

يمكنك استخدام الأداة lpdump (الرمز المصدر ضمن system/extras/partition_tools) لتفريغ البيانات الوصفية على جهازك. على سبيل المثال:

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

مسار التحديث

  1. ابدأ البيانات الوصفية للقسم super.
    1. حمِّل نطاقات الأقسام الديناميكية المصدرية من خدمة Metadata S. لنفترض أنّ M هي البيانات الوصفية التي تم تحميلها.
    2. أزِل المجموعات المستهدَفة والأقسام (مثل foo_t وbar_t) من M، ليحتوي M على الأقسام والمجموعات التي تتضمّن اللاحقة _s فقط.
    3. أضِف المجموعات المستهدَفة والأقسام وفقًا لحقل dynamic_partition_metadata في بيان التحديث.
      يمكنك الاطّلاع على حجم كل قسم في new_partition_info.
    4. اكتب M إلى Metadata T.
    5. ربط الأقسام المُضافة على أداة ربط الأجهزة على أنّها قابلة للكتابة
  2. طبِّق التحديث على الأجهزة المحظورة.
    1. إذا لزم الأمر، اربط أقسام المصدر على أداة ربط الأجهزة على أنّها للقراءة فقط. وهذا الإجراء ضروري للتثبيت الجانبي لأنّه لا يتم ربط الأقسام المصدر قبل التحديث.
    2. تطبيق تحديث كامل أو جزئي على جميع أجهزة الحظر في الخانة المستهدَفة
    3. ثبِّت الأقسام لتشغيل البرنامج النصي بعد التثبيت، ثم ألغِ تثبيت الأقسام.
  3. إلغاء ربط الأقسام المستهدَفة

قبل التحديث وبعده، يجب أن تتضمّن خصائص النظام التالية القيم المحدّدة:

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

إضافة مجموعات وأقسام إلى بيان التحديث

عند إجراء تحديث عبر الأثير (OTA) على جهاز A/B يتضمّن أقسامًا ديناميكية، أو على جهاز A/B يضيف إمكانية استخدام الأقسام الديناميكية، عليك إضافة مجموعات وأقسام إلى بيان التحديث. تعرض المقتطفة أدناه معلومات إضافية حول بيان التحديث لدعم الأقسام الديناميكية. يمكنك الاطّلاع على update_metadata.proto للحصول على مستندات تفصيلية حول كل حقل.

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;
}