يتوافق نظام التشغيل 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 (غير مستخدَمة)
- البيانات الوصفية 0
- جهاز الحظر الفعلي
system_b
- البيانات الوصفية 0 (غير مستخدَمة)
- البيانات الوصفية 1
- المجموعة foo_b
- التقسيم المنطقي (الديناميكي)
system_b
- التقسيم المنطقي (الديناميكي)
product_services_b
- الأقسام الأخرى التي عدّلها Foo
- التقسيم المنطقي (الديناميكي)
- Group 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 والإصدارات الأقدم، لا يتيح برنامج 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
التحديثات المستقبلية بعد التعديل
بعد تحديث التعديل التحديثي، يتم تعديل عميل التحديث عبر الهواء ليعمل مع الأقسام الديناميكية. لا تمتد نطاقات الأقسام المصدر مطلقًا على مستوى الأقسام المادية المستهدَفة.
خطوات التحديث باستخدام حزمة تحديث عادية
- ابدأ بتهيئة البيانات الوصفية للقسم
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 بـ Metadata 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
المنطقية عند بدء التشغيل.
إنشاء حِزم التحديث
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
كخطوة بعد التثبيت ويتم رفض التحديث.