يتيح نظام التشغيل Android 10 استخدام الأقسام الديناميكية، وهو نظام لقسمة مساحة المستخدمين يمكنه إنشاء الأقسام وتغيير حجمها ومحوها أثناء عمليات التحديث عبر الهواء.
توضّح هذه الصفحة كيفية تغيير عملاء 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
- الأقسام الأخرى التي عدّلها فوزي
- القسم المنطقي (الديناميكي)
- المجموعة
bar_a
- القسم المنطقي (الديناميكي)
vendor_a
- التقسيم المنطقي (الديناميكي)
product_a
- الأقسام الأخرى التي عدّلها Bar
- القسم المنطقي (الديناميكي)
- المجموعة
- البيانات الوصفية 1 (غير مستخدَمة)
- البيانات الوصفية 0
- جهاز التخزين المُجمَّع
system_b
- البيانات الوصفية 0 (غير مستخدَمة)
- البيانات الوصفية 1
- المجموعة foo_b
- التقسيم المنطقي (الديناميكي)
system_b
- التقسيم المنطقي (الديناميكي)
product_services_b
- الأقسام الأخرى التي عدّلها فوزي
- التقسيم المنطقي (الديناميكي)
- المجموعة bar_b
- التقسيم المنطقي (الديناميكي)
vendor_b
- التقسيم المنطقي (الديناميكي)
product_b
- الأقسام الأخرى التي عدّلها Bar
- التقسيم المنطقي (الديناميكي)
- المجموعة foo_b
يمكنك استخدام أداة 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 والإصدارات الأقدم، لا يتوافق العميل الذي يتلقّى التحديثات عبر الهواء على الجهاز مع ربط الأقسام الديناميكية قبل التحديث. يتم إنشاء مجموعة إضافية من التعديلات لكي يمكن تطبيق عملية الربط مباشرةً على الأقسام المادية الحالية.
ينشئ أداة إنشاء التحديثات من خلال الهواء ملف 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 للعمل مع الأقسام الديناميكية. لا تمتد نطاقات الأقسام المصدر أبدًا على مستوى الأقسام المادية المستهدَفة.
خطوات التحديث باستخدام حزمة تحديث عادية
- ابدأ البيانات الوصفية للقسيمة
super
.-
أنشئ بيانات وصفية جديدة M من البيانات الوصفية S (البيانات الوصفية للمصدر).
على سبيل المثال، إذا كانت البيانات الوصفية S تستخدم [
system_s
،vendor_s
،product_s
] كأجهزة حظر، ستستخدم البيانات الوصفية الجديدة M [system_t
،vendor_t
،product_t
] كأجهزة حظر. يتم تجاهل جميع المجموعات والأقسام في M. -
أضِف المجموعات والشرائح المستهدَفة وفقًا لحقل
dynamic_partition_metadata
في بيان التحديث. يمكن العثور على حجم كل قسم فيnew_partition_info
. - اكتب M في حقل البيانات الوصفية T.
- يمكنك ربط الأقسام المُضافة في أداة ربط الأجهزة على أنّها قابلة للكتابة.
-
أنشئ بيانات وصفية جديدة M من البيانات الوصفية S (البيانات الوصفية للمصدر).
على سبيل المثال، إذا كانت البيانات الوصفية S تستخدم [
- طبِّق التحديث على الأجهزة المحظورة.
- إذا لزم الأمر، يمكنك ربط أقسام المصدر في أداة ربط الأجهزة للقراءة فقط. هذا الإجراء ضروري لتحميل التطبيقات من مصدر غير معروف لأنّه لم يتم ربط أقسام المصدر قبل التحديث.
- تطبيق تحديث كامل أو تحديث دلتا على جميع الأجهزة المحظورة في الخانة المستهدفة
- شغِّل الوحدات لتتمكّن من تشغيل النص البرمجي لعمليات ما بعد التثبيت، ثم فكِّ ربط الوحدات.
- أزِل الربط بين الأقسام المستهدَفة.
خطوات التحديث باستخدام حزمة تحديث لتطبيق قديم
إذا تم تطبيق حزمة تحديث التعديل على جهاز مفعَّل فيه
الأقسام الديناميكية، يطبِّق برنامج OTA ملف
super.img
المُقسَّم على أجهزة التخزين مباشرةً. تشبه عملية التحديث
عملية تحديث الإصدارات القديمة. اطّلِع على مقالة تعديل تحديث سابق للحصول على التفاصيل.
على سبيل المثال، نفترض ما يلي:
- الفتحة "أ" هي الفتحة النشطة.
-
يحتوي
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 المتزايد
عند إنشاء تحديثات 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
كخطوة ما بعد التثبيت ويرفض
التحديث.