يتيح نظام التشغيل Android 10 استخدام الأقسام الديناميكية، وهو نظام لقسمة مساحة المستخدمين يمكنه إنشاء الأقسام وتغيير حجمها ومحوها أثناء عمليات التحديث عبر الهواء.
توضح هذه الصفحة كيف تقوم عملاء OTA بتغيير حجم الأقسام الديناميكية أثناء إجراء تحديث أجهزة غير A/B.
بالنسبة إلى الأجهزة غير المزوّدة بميزة A/B، يتم تطبيق تحديث OTA للأقسام الديناميكية
باستخدام updater
داخل حزمة التحديث.
تحديث أجهزة التشغيل
ينطبق هذا القسم على الأجهزة التي ليست A/B التي يتم تشغيلها باستخدام الخصائص الديناميكية. دعم الأقسام تتمّ ترقية هذه الأجهزة من Android 10 إلى إصدارات أعلى.
إنشاء حِزم تحديثات
يتم إنشاء حِزم التحديثات عبر شبكة غير سلكية بواسطة النص البرمجي
ota_from_target_files
، والذي يمكن العثور عليه ضمن
build/make/tools/releasetools
. بشكل افتراضي،
تنشئ حزمة تُعدِّل system
vendor
قسمًا. إذا كانت هناك عوامل ديناميكية إضافية
الأقسام، مثل product
product_services
أو odm
،
يجب إنشاء التحديثات في
خاصة بالجهاز
الرمز.
لإنشاء التحديثات، نفِّذ
FullOTA_GetBlockDifferences()
و
IncrementalOTA_GetBlockDifferences()
في وحدة Python الموسّعة. هذان الاثنان
التي تُرجع قائمة تضم كائنات BlockDifference
،
يصف كل منها تصحيح التحديث الذي سيتم تطبيقه على
قسم القرص. لا ينبغي أن تكون الأقسام التي تعرضها هاتين الدالتين
تم تعديلها يدويًا أو التحقق منها في مكان آخر، على سبيل المثال في
*_InstallBegin()
أو *_InstallEnd()
مثال على إنشاء تحديث:
# device/yoyodyne/tardis/releasetools.py import os from common import BlockDifference, EmptyImage, GetUserImage # The joined list of user image partitions of source and target builds. # - Items should be added to the list if new dynamic partitions are added. # - Items should not be removed from the list even if dynamic partitions are # deleted. When generating an incremental OTA package, this script needs to # know that an image is present in source build but not in target build. USERIMAGE_PARTITIONS = [ "product", "odm", ] def GetUserImages(input_tmp, input_zip): return {partition: GetUserImage(partition, input_tmp, input_zip) for partition in USERIMAGE_PARTITIONS if os.path.exists(os.path.join(input_tmp, "IMAGES", partition + ".img"))} def FullOTA_GetBlockDifferences(info): images = GetUserImages(info.input_tmp, info.input_zip) return [BlockDifference(partition, image) for partition, image in images.items()] def IncrementalOTA_GetBlockDifferences(info): source_images = GetUserImages(info.source_tmp, info.source_zip) target_images = GetUserImages(info.target_tmp, info.target_zip) # Use EmptyImage() as a placeholder for partitions that will be deleted. for partition in source_images: target_images.setdefault(partition, EmptyImage()) # Use source_images.get() because new partitions are not in source_images. return [BlockDifference(partition, target_image, source_images.get(partition)) for partition, target_image in target_images.items()]
تعديل المسار
خلف الكواليس، تُضاف الوظائف التالية إلى EDify النص البرمجي:
unmap_partition(name)
- عليك إلغاء تعيين القسم في حال ربطه، وإلا لا يتم اتخاذ أي إجراء.
- عرض السلسلة
t
عند نجاح الإجراء أو عرض قيمة فارغة سلسلة عند الفشل.
map_partition(name)
- ربط القسم إذا لم يكن مرتبطًا
- إرجاع المسار المطلق لجهاز الكتلة المعين عند النجاح، أو سلسلة فارغة عند الفشل.
update_dynamic_partitions(op_list)
- طبِّق قائمة العمليات المحدّدة على البيانات الوصفية للقسم الديناميكي، إلغاء تعيين الأقسام إذا لزم الأمر.
-
عرض
t
عند نجاح الإجراء، أو سلسلة فارغة عند التعذُّر.
الوسيطة op_list
إلى
يشير update_dynamic_partitions
إلى ملف في
حزمة التحديث. يحدّد كل سطر في الملف عملية. إن توفّرت
تعذّر إتمام العملية، update_dynamic_partitions
على الفور
تُرجع سلسلة فارغة. العمليات هي:
resize partition-name size
- ألغِ ربط القسم، ثم غيِّر حجمه إلى size.
remove partition_name
- ألغِ ربط القسم، ثم أزِله.
add partition-name group-name
- أضِف قسمًا جديدًا إلى المجموعة المحدّدة.
- يمكنك إلغاء عملية الإيقاف في حال عدم توفّر المجموعة أو إذا كان التقسيم حاليًا. الموجودة.
move partition-name group-name
- نقل القسم إلى المجموعة المحدّدة
- يجب التوقف إذا لم تكن المجموعة موجودة أو لم يكن القسم متوفّرًا.
-
add_group group-name maximum-size
- أضِف مجموعة بالاسم المحدّد والحد الأقصى للحجم.
- ويمكنك إلغاء العملية إذا كانت المجموعة متوفّرة من قبل.
- تشير القيمة 0 في maximum_size إلى عدم وجود حدود لحجم التقسيمات في المجموعة. يجب إجراء اختبار إضافي لتأكيد أنّ الأقسام في المجموعة لا تتجاوز المساحة المتاحة على الجهاز.
-
resize_group group-name maximum-size
- قم بتغيير حجم المجموعة إلى الحد الأقصى المحدد.
- ويمكنك إلغاء العملية إذا لم تكن المجموعة متوفّرة.
- تشير القيمة 0 في maximum_size إلى عدم وجود حدود لحجم التقسيمات في المجموعة. يجب إجراء اختبار إضافي التأكد من أن الأقسام في المجموعة لا تتجاوز المساحة المتوفرة على الجهاز.
remove_group group-name
- إزالة مجموعة
- ويمكنك إلغاء العملية إذا كانت هناك أقسام في المجموعة.
remove_all_groups
- ألغِ تعيين جميع الأقسام من برنامج خرائط الأجهزة.
- أزِل جميع الأقسام والمجموعات.
تزايدي عبر الهواء
تستخدم التحديثات التزايدية عبر الهواء المنطق التالي:
- تصغير الأقسام/حذف الأقسام/نقل الأقسام خارج المجموعة (لكي تتوفّر مساحة كافية لتصغير المجموعات)
- تصغير المجموعات (لكي تتوفّر مساحة كافية لتوسيع المجموعات)
- توسيع المجموعات (بحيث يكون لدينا مساحة كافية للتطور/الإضافة) الأقسام)
- زيادة الأقسام أو إضافة أقسام أو نقل الأقسام إلى مجموعة جديدة
بالتفصيل، يتم إنشاء update-script
باستخدام هذا العنصر.
المنطق:
for each shrinking partition: block_image_update(map_partition(name), …) update_dynamic_partitions(op_list) for each growing / adding partition: block_image_update(map_partition(name), …)
يتم إنشاء ملف op_list
لملف
update_dynamic_partitions
باستخدام منطق
هذا:
for each deleting partition: remove for each partition that changes groups: move to "default" for each shrinking partition: resize for each shrinking / removing group: resize_group / remove_group for each growing / adding group: resize_group / add_group for each adding partition: add for each growing / adding partition: resize for each partition that changes groups: move to target group
التحديث عبر الهواء الكامل
تستخدِم التحديثات الكاملة عبر شبكة غير سلكية المنطق التالي:
- حذف كل المجموعات والأقسام الحالية
- إضافة مجموعات
- إضافة أقسام
بالتفصيل، يتم إنشاء update-script
باستخدام هذا العنصر.
المنطق:
update_dynamic_partitions(op_list) for each adding partition: block_image_update(map_partition(name), …)
يتم إنشاء ملف op_list
لأجل
update_dynamic_partitions
باستخدام
المنطق التالي:
remove_all_groups for each adding group: add_group for each adding partition: add for each adding partition: resize