يدعم 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 (غير مستخدمة)
- البيانات الوصفية 0
- جهاز الكتلة المادية
system_b
- البيانات الوصفية 0 (غير مستخدمة)
- البيانات الوصفية 1
- المجموعة fo_b
- القسم المنطقي (الديناميكي)
system_b
- القسم المنطقي (الديناميكي)
product_services_b
- تم تحديث الأقسام الأخرى بواسطة Foo
- القسم المنطقي (الديناميكي)
- شريط المجموعة_ب
- القسم المنطقي (الديناميكي)
vendor_b
- القسم المنطقي (الديناميكي)
product_b
- تم تحديث الأقسام الأخرى بواسطة Bar
- القسم المنطقي (الديناميكي)
- المجموعة fo_b
يمكنك استخدام أداة 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 للعمل مع الأقسام الديناميكية. لا تمتد نطاقات الأقسام المصدر مطلقًا عبر الأقسام الفعلية المستهدفة.
تحديث التدفق باستخدام حزمة التحديث العادية
- تهيئة بيانات تعريف القسم
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
المقسم على الأجهزة المحظورة مباشرةً. يشبه تدفق التحديث التحديث التحديثي. راجع تحديث التحديث للحصول على التفاصيل.
على سبيل المثال، افترض ما يلي:
- الفتحة 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
كخطوة ما بعد التثبيت ويرفض التحديث.