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

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

توضِّح هذه الصفحة كيفية تغيير حجم الأقسام الديناميكية أثناء تحديث أجهزة 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
    • المجموعة bar_a
      • القسم vendor_a
      • القسم product_a
      • تم تعديل الأقسام الأخرى بواسطة شريط.
    • المجموعة foo_b (ما تبقى من الترقية السابقة)
    • المجموعة bar_b (بقايا من عملية الترقية السابقة)
  • البيانات الوصفية 1
    • المجموعة foo_a (ما تبقى من الترقية السابقة)
    • المجموعة bar_a (بقايا من عملية الترقية السابقة)
    • المجموعة foo_b
      • القسم system_b
      • القسم product_services_b
      • تم تحديث الأقسام الأخرى بواسطة Foo
    • المجموعة bar_b
      • القسم vendor_b
      • القسم product_b
      • تم تعديل الأقسام الأخرى بواسطة شريط.

يمكنك استخدام أداة 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. تحميل نطاقات الأقسام الديناميكية للمصدر من البيانات الوصفية سباستيان اجعل M هي بيانات التعريف المحملة.
    2. أزِل المجموعات المستهدفة والأقسام (على سبيل المثال، foo_t، bar_t) من M بحيث تحتوي M على هي الأقسام والمجموعات فقط التي تحتوي على اللاحقة _s.
    3. إضافة المجموعات المستهدفة والأقسام وفقًا الحقل "dynamic_partition_metadata" في عملية التعديل البيان.
      يمكن معرفة حجم كل قسم في new_partition_info
    4. اكتب M في الحقل 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;
}