التحديث عبر الهواء لأجهزة 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
      • الأقسام الأخرى التي عدّلها فوزي
    • المجموعة 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. حمِّل النطاقات للشرائح الديناميكية المصدر من البيانات الوصفية S. لنفترض أنّ 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

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

عند إجراء تحديث عبر الهواء على جهاز 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;
}