بناء حزم التحديث عبر الهواء

يمكنك استخدام أداة ota_from_target_files المتوفرة في "build/make/tools/releasetools" لإنشاء حزم كاملة وتتزايدية للأجهزة التي تستخدم تحديثات نظام A/B أو تحديثات نظام A/B. تأخذ الأداة ملف target-files.zip الذي تم إنشاؤه من خلال نظام إصدار Android كإدخال.

بالنسبة إلى الأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأحدث، يمكنك إنشاء حزمة واحدة عبر الهواء لأجهزة متعدّدة برموز تخزين تعريفية مختلفة. ويتطلب إجراء ذلك ضبط الأجهزة المستهدَفة لاستخدام الملفات المرجعية الديناميكية وتعديل البيانات الوصفية عبر الهواء لتضمين اسم الجهاز وبصمة الإصبع في إدخالات الحالة السابقة واللاحقة.

تم إيقاف حِزم OTA المستندة إلى الملفات نهائيًا في Android 8.0 للأجهزة غير التابعة لشركة A/B، والتي يجب أن تستخدم حِزم التحديث عبر الهواء المستندة إلى حظر بدلاً من ذلك. لإنشاء حزم عبر الهواء مستندة إلى حظر أو أجهزة تعمل بالإصدار 7.x من نظام التشغيل Android أو إصدارات أقدم، يمكنك تمرير الخيار --block إلى المعلَمة ota_from_target_files.

إصدار التحديثات الكاملة

التحديث الكامل هو حزمة OTA تحتوي على الحالة النهائية الكاملة للجهاز (أقسام النظام والتشغيل والاسترداد). وما دام الجهاز قادرًا على تلقّي الحِزمة وتطبيقها، يمكن للحزمة تثبيت الإصدار بغض النظر عن حالة الجهاز الحالية. على سبيل المثال، تستخدم الأوامر التالية أدوات الإصدار لإنشاء أرشيف target-files.zip لجهاز tardis.

. build/envsetup.sh && lunch tardis-eng
mkdir dist_output
make dist DIST_DIR=dist_output

ينشئ make dist حزمة كاملة من OTA (في $OUT). يحتوي ملف .zip الناتج على كل ما يلزم لإنشاء حزم عبر الهواء لجهاز tardis. ويمكنك أيضًا إنشاء ota_from_target_files على شكل ثنائي بايثون وطلب إنشاء حزم كاملة أو تزايدية.

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

تم إعداد مسار ota_from_target_files في $PATH، ويقع ثنائي بايثون الناتج في الدليل out/.

أصبح ota_update.zip جاهزًا الآن لإرساله إلى أجهزة الاختبار (تم توقيع كل العناصر باستخدام المفتاح التجريبي). بالنسبة إلى أجهزة المستخدمين، يمكنك إنشاء مفاتيحك الخاصة واستخدامها كما هو موضَّح في توقيع الإصدارات للإصدار.

إنشاء تحديثات تدريجية

التحديث تزايدي هو حزمة OTA تحتوي على رموز تصحيح ثنائية للبيانات الموجودة على الجهاز بالفعل. عادةً ما تكون الحزم ذات التحديثات التزايدية أصغر لأنها لا تحتاج إلى تضمين الملفات غير المتغيرة. بالإضافة إلى ذلك، ونظرًا لأن الملفات التي يتم تغييرها غالبًا ما تكون مشابهة جدًا لإصداراتها السابقة، لا تحتاج الحزمة إلا إلى تضمين ترميز للاختلافات بين الملفين.

لا يمكنك تثبيت حزمة التحديث التزايدي إلا على الأجهزة التي تحتوي على إصدار المصدر المستخدَم في إنشاء الحزمة. لإنشاء تحديث تزايدي، يجب توفُّر ملف target_files.zip من الإصدار السابق (الملف الذي تريد التحديث منه)، بالإضافة إلى ملف target_files.zip من الإصدار الجديد. على سبيل المثال، تستخدم الأوامر التالية أدوات الإصدار لإنشاء تحديث تزايدي لجهاز tardis.

ota_from_target_files -i PREVIOUS-tardis-target_files.zip dist_output/tardis-target_files.zip incremental_ota_update.zip

يشبه هذا الإصدار إلى حد كبير الإصدار السابق، وحزمة التحديث التزايدي (incremental_ota_update.zip) أصغر بكثير من حجم التحديث الكامل المقابل (حوالي 1 ميغابايت بدلاً من 60 ميغابايت).

يمكنك توزيع حزمة التزايد فقط على الأجهزة التي تعمل نفس الإصدار السابق بالضبط والمستخدم كنقطة بداية الحزمة التزايدية. يجب تثبيت الصور في نظام التشغيل PREVIOUS-tardis-target_files.zip أو PREVIOUS-tardis-img.zip (في كل من الإصدارَين make dist ويتم تحديثهما باستخدام fastboot update)، بدلاً من الصور المتوفرة ضمن الدليل PRODUCT_OUT (الذي تم إنشاؤه باستخدام make، والذي سيتم تحديثه باستخدام fastboot flashall). محاولة تثبيت الحزمة التزايدية على جهاز تظهر به بعض نتائج الإصدار الأخرى يؤدي إلى حدوث خطأ في التثبيت. عند تعذُّر التثبيت، يظل الجهاز في حالة العمل نفسها (تشغيل النظام القديم)؛ وتتحقق الحزمة من الحالة السابقة لجميع الملفات التي يحدّثها قبل لمسها، بحيث لا يكون الجهاز عالقًا في حالة نصف تمت ترقيتها.

لتقديم أفضل تجربة للمستخدم، يجب عرض تحديث كامل لكل من 3 إلى 4 تحديثات تزايدية. يساعد هذا المستخدمين في متابعة أحدث إصدار وتجنب سلسلة طويلة من عمليات التثبيت من التحديثات الإضافية.

إنشاء حزم التحديث عبر الهواء لرموز تخزين تعريفية متعددة

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

لمحة عن رموز التخزين التعريفية

تنسيق رمز التخزين التعريفي هو أحد صيغ قيم معلَمات الإنشاء المدمجة، وعادةً ما يكون مجموعة فرعية غير معلَنة من معلَمات build_fingerprint الحالية. يمكن للمصنّعين الأصليين للأجهزة استخدام أي مجموعة من معلمات التصميم المعتمدة من CDD لرمز التخزين التعريفي، مع استخدام صورة واحدة لرموز التخزين التعريفية هذه أيضًا. على سبيل المثال، يحتوي رمز التخزين التعريفي التالي على أشكال متعددة:

SKU = <product><device><modifierA><modifierB><modifierC>
  • modifierA هو مستوى الجهاز (مثل Pro أو Premium أو Plus)
  • modifierB هو تنوع الأجهزة (مثل الراديو)
  • modifierC هي المنطقة، التي يمكن أن تكون عامة (مثل أمريكا الشمالية أو أوروبا والشرق الأوسط وأفريقيا أو الصين ) أو خاصة بكل بلد أو لغة (مثل JPN أو ENG أو CHN)

يستخدم العديد من المصنّعين الأصليين للأجهزة صورة واحدة لرموز تخزين تعريفية متعددة، ثم يستخرجون اسم المنتج النهائي وبصمة الإصبع في وقت التشغيل بعد تشغيل الجهاز. وتعمل هذه العملية على تبسيط عملية تطوير النظام الأساسي، ما يتيح للأجهزة ذات التخصيصات البسيطة والتي تتضمن أسماء منتجات مختلفة مشاركة الصور الشائعة (مثل tardis وtardispro).

استخدام بصمات الأصابع الديناميكية

الملف المرجعي هو تسلسل محدّد من مَعلمات الإصدار، مثل ro.product.brand وro.product.name وro.product.device. يتم استخراج بصمة الجهاز من الملف المرجعي لقسم النظام ويتم استخدامها كمعرّف فريد للصور (ووحدات البايت) التي تعمل على الجهاز. لإنشاء بصمة ديناميكية، استخدِم المنطق الديناميكي في ملف build.prop الخاص بالجهاز للحصول على قيمة متغيّرات برنامج الإقلاع في وقت تشغيل الجهاز، ثم استخدِم هذه البيانات لإنشاء بصمة إصبع ديناميكية لهذا الجهاز.

على سبيل المثال، لاستخدام بصمات الأصابع الديناميكية لجهازَي tardis وtardispro، عليك تعديل الملفات التالية كما هو موضّح أدناه.

  • عدِّل ملف odm/etc/build_std.prop ليتضمّن السطر التالي.

    ro.odm.product.device=tardis
    
  • عدِّل ملف odm/etc/build_pro.prop ليتضمّن السطر التالي.

    ro.odm.product.device=tardispro
    
  • عدِّل ملف odm/etc/build.prop ليتضمّن الأسطر التالية.

    ro.odm.product.device=tardis
    import /odm/etc/build_${ro.boot.product.hardware.sku}.prop
    

تضبط هذه الخطوط بشكل ديناميكي اسم الجهاز وبصمة الإصبع وقيم ro.build.fingerprint استنادًا إلى قيمة سمة برنامج الإقلاع ro.boot.product.hardware.sku (المتاحة للقراءة فقط).

تعديل البيانات الوصفية لحزمة الاتصال عبر الهواء

تحتوي حزمة OTA على ملف بيانات وصفية (META-INF/com/android/metadata) يصف الحزمة، بما في ذلك الشرط المسبق والحالة اللاحقة لحزمة OTA. على سبيل المثال، الرمز التالي هو ملف البيانات الوصفية لحزمة OTA التي تستهدف جهاز tardis.

post-build=google/tardis/tardis:11/RP1A.200521.001/6516341:userdebug/dev-keys
post-build-incremental=6516341
post-sdk-level=30
post-security-patch-level=2020-07-05
post-timestamp=1590026334
pre-build=google/tardis/tardis:11/RP1A.200519.002.A1/6515794:userdebug/dev-keys
pre-build-incremental=6515794
pre-device=tardis

تحدد قيم pre-device وpre-build-incremental وpre-build الحالة التي يجب أن يمتلكها الجهاز قبل أن تتمكن من تثبيت حزمة OTA. وتحدِّد قيمتا post-build-incremental وpost-build الحالة المتوقّعة للجهاز بعد تثبيت حزمة التحديث عبر الهواء. يتم اشتقاق قيم حقلي pre- وpost- من خصائص التصميم المقابلة التالية.

  • يتم استخراج قيمة pre-device من موقع الإصدار ro.product.device.
  • يتم اشتقاق قيمتَي pre-build-incremental وpost-build-incremental من سمة الإصدار ro.build.version.incremental.
  • يتم اشتقاق قيمتَي pre-build وpost-build من موقع الإصدار "ro.build.fingerprint".

على الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث، يمكنك استخدام علامة --boot_variable_file في أدوات التحديث عبر الهواء لتحديد مسار إلى ملف يحتوي على قيم متغيرات بيئة التشغيل المستخدمة في إنشاء الملف المرجعي الديناميكي للجهاز. يتم بعد ذلك استخدام البيانات لتعديل البيانات الوصفية OTA لتضمين اسم الجهاز وبصمة الإصبع في شرطي pre- وpost- (باستخدام حرف الأنبوب | كمحدِّد). تحتوي العلامة --boot_variable_file على البنية والوصف التاليين.

  • البنية: --boot_variable_file <path>
  • الوصف: تحدّد مسارًا إلى ملف يحتوي على القيم المحتملة لسمات ro.boot.*. يتم استخدامه لاحتساب الملفات المرجعية المحتملة لبيئة التشغيل عندما تتجاهل عبارة الاستيراد بعض سمات ro.product.*. ويتوقّع الملف سمة واحدة في كل سطر يكون فيه كل سطر بالتنسيق التالي: prop_name=value1,value2.

على سبيل المثال، عندما تكون السمة ro.boot.product.hardware.sku=std,pro، تظهر البيانات الوصفية لأجهزة tardis وtardispro على النحو الموضّح أدناه.

post-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-build=google/tardis/tardis:11/<suffix>|google/tardis/tardispro:11/<suffix>
pre-device=tardis|tardispro

لإتاحة هذه الوظيفة على الأجهزة التي تعمل بنظام التشغيل Android 10، يمكنك الاطّلاع على طريقة التنفيذ الخاصة بالمرجع. تحلِّل قائمة التغييرات هذه عبارات import بشكل مشروط في ملف build.prop، ما يتيح التعرّف على عمليات إلغاء السمة وعرضها في البيانات الوصفية النهائية عبر اتصال لاسلكي.