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

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

توضّح هذه الصفحة كيفية تغيير حجم الأقسام الديناميكية من خلال برامج 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 كأجهزة حظر.

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

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

Incremental 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 \

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