إنشاء حِزم OTA

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

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

أوقف الإصدار 8.0 من نظام التشغيل Android نهائيًا حِزم OTA المستندة إلى الملفات للأجهزة غير المتوافقة مع نظام التشغيل A/B، والتي يجب أن تستخدم بدلاً من ذلك حِزم OTA المستندة إلى الحظر. لإنشاء حِزم OTA مستندة إلى الحظر أو الأجهزة التي تعمل بالإصدار 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 حزمة تحديث كامل عبر الهواء (في $OUT). يحتوي ملف .zip الناتج على كل ما يلزم لإنشاء حِزم تحديث عبر الهواء لجهاز tardis. يمكنك أيضًا إنشاء ota_from_target_files كملف ثنائي لغة Python واستدعائه لإنشاء حِزم كاملة أو إضافية.

ota_from_target_files dist_output/tardis-target_files.zip ota_update.zip

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

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

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

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

لا يمكنك تثبيت حزمة تحديث إضافية إلا على الأجهزة التي تتضمّن إصدار المصدر المستخدَم في إنشاء الحزمة. لإنشاء تحديث تراكمي، تحتاج إلى ملف 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 تحديثات إضافية. يساعد ذلك المستخدمين في الاطّلاع على أحدث إصدار وتجنُّب سلسلة طويلة من التحديثات التزايدية.

إنشاء حِزم OTA لرموز تخزين تعريفية متعددة

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

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

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

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

يستخدم العديد من المصنّعين الأصليين للأجهزة صورة واحدة لعدة وحدات حفظ مخزون، ثم يستمدون اسم المنتج النهائي وبصمة الجهاز في وقت التشغيل بعد بدء تشغيل الجهاز. تؤدي هذه العملية إلى تبسيط عملية تطوير المنصة، ما يتيح للأجهزة التي تتضمّن تعديلات بسيطة ولكن بأسماء منتجات مختلفة مشاركة الصور الشائعة (مثل 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 الحالة التي يجب أن يكون عليها الجهاز قبل أن يتمكّن من تثبيت حزمة التحديث عبر الهواء. تحدّد القيمتان post-build-incremental وpost-build الحالة التي من المتوقّع أن يكون عليها الجهاز بعد تثبيت حزمة OTA. يتم استخلاص قيم الحقلَين pre- وpost- من خصائص الإصدار المقابلة التالية.

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

على الأجهزة التي تعمل بنظام التشغيل Android 11 أو الإصدارات الأحدث، يمكنك استخدام العلامة --boot_variable_file في أدوات التحديث عبر الهواء (OTA) لتحديد مسار إلى ملف يحتوي على قيم المتغيرات في وقت التشغيل المستخدَمة في إنشاء البصمة الرقمية الديناميكية للجهاز. بعد ذلك، يتم استخدام البيانات لتعديل البيانات الوصفية الخاصة بالتحديث عبر الأثير (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، تكون البيانات الوصفية عبر الأثير (OTA) للأجهزة 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

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