التحديث عبر الهواء لأجهزة 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، وهما تتوافقان مع خانات اختبار A/B للأقسام. في هذه الصفحة، تُسمى خانات البيانات الوصفية "البيانات الوصفية 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;
}