OTA لأجهزة A/B بدون أقسام ديناميكية

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

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

خلفية

أثناء تحديث جهاز A/B لدعم الأقسام الديناميكية، يتم الاحتفاظ بجدول أقسام GUID (GPT) الموجود على الجهاز، لذلك لا يوجد قسم super على الجهاز. يتم تخزين البيانات التعريفية في system_a و system_b ، ولكن يمكن تخصيص ذلك عن طريق تغيير BOARD_SUPER_PARTITION_METADATA_DEVICE .

يوجد في كل جهاز من أجهزة الكتلة فتحتان للبيانات التعريفية. يتم استخدام فتحة واحدة فقط للبيانات التعريفية في كل جهاز كتلة. على سبيل المثال، تتوافق البيانات الوصفية 0 في system_a والبيانات الوصفية 1 في system_b مع الأقسام الموجودة في الفتحتين A وB، على التوالي. في وقت التشغيل، لا يهم أي فتحة يتم تحديثها.

في هذه الصفحة، تُسمى فتحات البيانات التعريفية Metadata S (المصدر) وMetadata T (الهدف). وبالمثل، تتم الإشارة إلى الأقسام باسم system_s ، و vendor_t ، وما إلى ذلك.

لمزيد من المعلومات حول إنشاء تكوينات النظام ، راجع ترقية الأجهزة .

لمزيد من المعلومات حول كيفية انتماء الأقسام إلى مجموعات التحديث ، راجع تغييرات تكوين اللوحة للأجهزة الجديدة.

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

  • system_a جهاز الكتلة المادية_أ
    • البيانات الوصفية 0
      • المجموعة foo_a
        • القسم المنطقي (الديناميكي) system_a
        • القسم المنطقي (الديناميكي) product_services_a
        • تم تحديث الأقسام الأخرى بواسطة Foo
      • bar_a المجموعة_أ
        • القسم المنطقي (الديناميكي) vendor_a
        • القسم المنطقي (الديناميكي) product_a
        • تم تحديث الأقسام الأخرى بواسطة Bar
    • البيانات الوصفية 1 (غير مستخدمة)
  • جهاز الكتلة المادية system_b
    • البيانات الوصفية 0 (غير مستخدمة)
    • البيانات الوصفية 1
      • المجموعة fo_b
        • القسم المنطقي (الديناميكي) system_b
        • القسم المنطقي (الديناميكي) product_services_b
        • تم تحديث الأقسام الأخرى بواسطة Foo
      • شريط المجموعة_ب
        • القسم المنطقي (الديناميكي) vendor_b
        • القسم المنطقي (الديناميكي) product_b
        • تم تحديث الأقسام الأخرى بواسطة Bar

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

lpdump --slot 0 /dev/block/by-name/system_a
lpdump --slot 1 /dev/block/by-name/system_b

التحديثية التحديث

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

ينشئ منشئ OTA ملف super.img النهائي الذي يحتوي على محتوى جميع الأقسام الديناميكية، ثم يقسم الصورة إلى صور متعددة تطابق أحجام أجهزة الكتلة المادية المقابلة للنظام والبائع وما إلى ذلك. تتم تسمية هذه الصور باسم super_system.img و super_vendor.img وما إلى ذلك. يقوم عميل OTA بتطبيق هذه الصور على الأقسام المادية، بدلاً من تطبيق الصور على الأقسام المنطقية (الديناميكية).

نظرًا لأن عميل OTA لا يعرف كيفية تعيين الأقسام الديناميكية، يتم تعطيل كافة خطوات ما بعد التثبيت تلقائيًا لهذه الأقسام عند إنشاء حزمة التحديث. راجع تكوين ما بعد التثبيت لمزيد من التفاصيل.

تدفق التحديث هو نفسه كما في Android 9.

قبل التحديث:

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

بعد التحديث:

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

التحديثات المستقبلية بعد التعديل التحديثي

بعد التحديث التحديثي، يتم تحديث عميل OTA للعمل مع الأقسام الديناميكية. لا تمتد نطاقات الأقسام المصدر مطلقًا عبر الأقسام الفعلية المستهدفة.

تحديث التدفق باستخدام حزمة التحديث العادية

  1. تهيئة بيانات تعريف القسم super .
    1. إنشاء بيانات وصفية جديدة M من بيانات التعريف S (بيانات تعريف المصدر). على سبيل المثال، إذا كانت البيانات التعريفية S تستخدم [ system_s , vendor_s , product_s ] كأجهزة كتلة، فإن البيانات التعريفية M الجديدة تستخدم [ system_t , vendor_t , product_t ] كأجهزة كتلة. يتم تجاهل كافة المجموعات والأقسام في M.
    2. قم بإضافة المجموعات والأقسام المستهدفة وفقًا لحقل dynamic_partition_metadata في بيان التحديث. يمكن العثور على حجم كل قسم في new_partition_info .
    3. اكتب M إلى البيانات الوصفية T.
    4. قم بتعيين الأقسام المضافة على مخطط الجهاز على أنها قابلة للكتابة.
  2. قم بتطبيق التحديث على الأجهزة المحظورة.
    1. إذا لزم الأمر، قم بتعيين الأقسام المصدر على مخطط الجهاز للقراءة فقط. يعد هذا ضروريًا للتحميل الجانبي لأنه لم يتم تعيين أقسام المصدر قبل التحديث.
    2. قم بتطبيق تحديث كامل أو تحديث دلتا على جميع الأجهزة المحظورة في الفتحة المستهدفة.
    3. قم بتحميل الأقسام لتشغيل البرنامج النصي بعد التثبيت، ثم قم بإلغاء تحميل الأقسام.
  3. قم بإلغاء تحديد الأقسام المستهدفة.

تحديث التدفق باستخدام حزمة التحديث التحديثي

إذا تم تطبيق حزمة التحديث التحديثي على جهاز يقوم بالفعل بتمكين الأقسام الديناميكية، فسيقوم عميل OTA بتطبيق ملف super.img المقسم على الأجهزة المحظورة مباشرةً. يشبه تدفق التحديث التحديث التحديثي. راجع تحديث التحديث للحصول على التفاصيل.

على سبيل المثال، افترض ما يلي:

  • الفتحة A هي الفتحة النشطة.
  • يحتوي system_a على بيانات التعريف النشطة في الفتحة 0.
  • يتم استخدام system_a و vendor_a و product_a كأجهزة كتلة.

عندما يتلقى عميل OTA حزمة تحديث تحديثية، فإنه يطبق super_system.img على system_b الفعلي، و super_vendor.img على vendor_b الفعلي، و super_product.img على product_b الفعلي. يحتوي جهاز الحظر الفعلي system_b على البيانات التعريفية الصحيحة لتعيين system_b و vendor_b و product_b في وقت التمهيد.

إنشاء حزم التحديث

OTA التزايدي

عند إنشاء وكالات السفر عبر الإنترنت المتزايدة للأجهزة التحديثية، تعتمد التحديثات على ما إذا كان الإصدار الأساسي يحدد PRODUCT_USE_DYNAMIC_PARTITIONS و PRODUCT_RETROFIT_DYNAMIC_PARTITIONS أم لا.

  • إذا لم يحدد البناء الأساسي المتغيرات، فهذا تحديث تحديثي. تحتوي حزمة التحديث على ملف super.img المقسم وتقوم بتعطيل خطوة ما بعد التثبيت.
  • إذا قام البناء الأساسي بتعريف المتغيرات، فهذا هو نفس التحديث النموذجي الذي يحتوي على أقسام ديناميكية. تحتوي حزمة التحديث على صور للأقسام المنطقية (الديناميكية). يمكن تمكين خطوة ما بعد التثبيت.

كامل عبر الهواء

يتم إنشاء حزمتين كاملتين عبر الهواء للأجهزة التحديثية.

  • $(PRODUCT)-ota-retrofit-$(TAG).zip يحتوي دائمًا على super.img المقسم ويعطل خطوة ما بعد التثبيت لتحديث التحديث.
    • يتم إنشاؤه باستخدام وسيطة إضافية --retrofit_dynamic_partitions إلى البرنامج النصي ota_from_target_files .
    • ويمكن تطبيقه على جميع البنيات.
  • يحتوي $(PRODUCT)-ota-$(TAG).zip على صور منطقية للتحديثات المستقبلية.
    • قم بتطبيق هذا فقط على الإصدارات التي تم تمكين الأقسام الديناميكية فيها. انظر التفاصيل أدناه حول تطبيق ذلك.

رفض التحديث غير التحديثي على الإصدارات القديمة

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

لمنع الجهاز من قبول حزمة OTA الكاملة، يمكنك طلب خطوة ما بعد التثبيت للتحقق من تكوين الجهاز الحالي. على سبيل المثال:

device/ device_name /dynamic_partitions/check_dynamic_partitions

#!/system/bin/sh
DP_PROPERTY_NAME="ro.boot.dynamic_partitions"
DP_RETROFIT_PROPERTY_NAME="ro.boot.dynamic_partitions_retrofit"

DP_PROPERTY=$(getprop ${DP_PROPERTY_NAME})
DP_RETROFIT_PROPERTY=$(getprop ${DP_RETROFIT_PROPERTY_NAME})

if [ "${DP_PROPERTY}" != "true" ] || [ "${DP_RETROFIT_PROPERTY}" != "true" ] ; then
    echo "Error: applied non-retrofit update on build without dynamic" \
         "partitions."
    echo "${DP_PROPERTY_NAME}=${DP_PROPERTY}"
    echo "${DP_RETROFIT_PROPERTY_NAME}=${DP_RETROFIT_PROPERTY}"
    exit 1
fi

device/ device_name /dynamic_partitions/Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= check_dynamic_partitions
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_SRC_FILES := check_dynamic_partitions
LOCAL_PRODUCT_MODULE := true
include $(BUILD_PREBUILT)

device/ device_name /device.mk

PRODUCT_PACKAGES += check_dynamic_partitions

# OPTIONAL=false so that the error in check_dynamic_partitions will be
# propagated to OTA client.
AB_OTA_POSTINSTALL_CONFIG += \
    RUN_POSTINSTALL_product=true \
    POSTINSTALL_PATH_product=bin/check_dynamic_partitions \
    FILESYSTEM_TYPE_product=ext4 \
    POSTINSTALL_OPTIONAL_product=false \

عند تطبيق حزمة OTA العادية على جهاز دون تمكين الأقسام الديناميكية، يقوم عميل OTA بتشغيل check_dynamic_partitions كخطوة ما بعد التثبيت ويرفض التحديث.