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

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

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

خلفية

أثناء تحديث جهاز 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
      • المجموعة foo_b
        • التقسيم المنطقي (الديناميكي) system_b
        • التقسيم المنطقي (الديناميكي) product_services_b
        • الأقسام الأخرى التي عدّلها Foo
      • Group bar_b
        • التقسيم المنطقي (الديناميكي) 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

تعديل تحديث

على الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android والإصدارات الأقدم، لا يتيح برنامج 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

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

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

خطوات التحديث باستخدام حزمة تحديث عادية

  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 إلى Metadata T.
    4. ربط الأقسام المُضافة على أداة ربط الأجهزة على أنّها قابلة للكتابة
  2. طبِّق التحديث على الأجهزة المحظورة.
    1. إذا لزم الأمر، اربط أقسام المصدر على أداة ربط الأجهزة كأقسام للقراءة فقط. وهذا الإجراء ضروري للتثبيت الجانبي لأنّه لا يتم ربط أقسام المصدر قبل التحديث.
    2. تطبيق تحديث كامل أو جزئي على جميع أجهزة الحظر في الخانة المستهدَفة
    3. ثبِّت الأقسام لتشغيل البرنامج النصي بعد التثبيت، ثم ألغِ تثبيت الأقسام.
  3. إلغاء ربط الأقسام المستهدَفة

خطوات التحديث باستخدام حزمة تحديث متوافقة مع الإصدارات القديمة

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

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

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

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

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

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

عند إنشاء حِزم 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 بشكل غير صحيح وتم إرسال هذه الحِزم إلى الأجهزة التي تعمل بالإصدار 9 من نظام التشغيل Android أو إصدار أقدم، سيتعذّر تشغيل الأجهزة. لا يمكن لبرنامج OTA على الإصدار 9 من نظام Android والإصدارات الأقدم التمييز بين حزمة 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 \

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