يمكنك استخدام الأداة ota_from_target_files
المتوفرة في build/make/tools/releasetools لإنشاء حِزم OTA كاملة وتزايدية
للأجهزة التي تستخدم تحديثات نظام A/B أو
تحديثات نظام غير A/B. تأخذ الأداة ملف target-files.zip الذي يُنتجه نظام التصميم في Android كإدخال.
بالنسبة إلى الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو إصدار أحدث، يمكنك إنشاء حزمة OTA واحدة لأجهزة متعدّدة ذات رموز تخزين تعريفية مختلفة. يتطلّب ذلك ضبط الأجهزة المستهدَفة لاستخدام بصمات الأصابع الديناميكية وتعديل البيانات الوصفية لحزمة OTA لتضمين اسم الجهاز وبصمة الإصبع في إدخالات الشرطَين السابق واللاحق.
في الإصدار 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-engmkdir dist_outputmake dist DIST_DIR=dist_output
ينشئ الأمر make dist حزمة OTA كاملة (في $OUT). يحتوي ملف .zip الناتج على كل ما يلزم لإنشاء حِزم OTA لجهاز tardis.
يمكنك أيضًا إنشاء ota_from_target_files كبرنامج ثنائي بلغة Python واستدعاؤه لإنشاء حِزم كاملة أو تزايدية.
ota_from_target_files dist_output/tardis-target_files.zip ota_update.zipيتم إعداد مسار ota_from_target_files في $PATH، ويقع الملف الثنائي الناتج بلغة Python في الدليل 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 ميغابايت).
لا توزِّع حزمة تزايدية إلا على الأجهزة التي تعمل بالإصدار السابق نفسه تمامًا الذي تم استخدامه كنقطة بداية للحزمة التزايدية. عليك تثبيت ذاكرة ROM
الصور في PREVIOUS-tardis-target_files.zip أو PREVIOUS-tardis-img.zip
(تم إنشاء كليهما باستخدام make dist، وسيتم تثبيت ذاكرة ROM باستخدام fastboot update)، بدلاً من
الصور الموجودة ضمن الدليل PRODUCT_OUT (تم إنشاؤها باستخدام make، وسيتم
تثبيت ذاكرة ROM باستخدام fastboot flashall). ستؤدي محاولة تثبيت الحزمة التزايدية
على جهاز يحتوي على إصدار آخر إلى حدوث خطأ في التثبيت. عندما يتعذّر التثبيت، يظل الجهاز في حالة العمل نفسها (يعمل بالنظام القديم)؛ تتحقّق الحزمة من الحالة السابقة لجميع الملفات التي تعدِّلها قبل تعديلها، لذا لا يظل الجهاز في حالة نصف تمت ترقيتها.
للحصول على أفضل تجربة للمستخدم، قدِّم تحديثًا كاملاً لكل 3 أو 4 تحديثات تزايدية. يساعد ذلك المستخدمين في مواكبة أحدث إصدار وتجنُّب تسلسل تثبيت طويل للتحديثات التزايدية.
إنشاء حِزم OTA لرموز تخزين تعريفية متعدّدة
يتيح الإصدار 11 من نظام التشغيل Android أو إصدار أحدث استخدام حزمة OTA واحدة لأجهزة متعدّدة ذات رموز تخزين تعريفية مختلفة. يتطلّب ذلك ضبط الأجهزة المستهدَفة لاستخدام بصمات الأصابع الديناميكية وتعديل البيانات الوصفية لحزمة OTA (باستخدام أدوات OTA) لتضمين اسم الجهاز وبصمة الإصبع في إدخالات الشرطَين السابق واللاحق.
لمحة عن رموز التخزين التعريفية
تتألف بنية رمز التخزين التعريفي من مجموعة من قيم مَعلمات الإصدار
المدمَجة، و
عادةً ما تكون مجموعة فرعية غير معلَنة من المَعلمات build_fingerprint الحالية.
يمكن لمصنّعي المعدات الأصلية استخدام أي مجموعة من مَعلمات الإصدار الموافق عليها في مستند تعريف التوافق (CDD) لرمز تخزين تعريفي، مع استخدام صورة واحدة أيضًا لرموز التخزين التعريفية هذه. على سبيل المثال، يحتوي رمز التخزين التعريفي التالي على أشكال متعدّدة:
SKU = <product><device><modifierA><modifierB><modifierC>
modifierAهو مستوى الجهاز (مثل Pro أو Premium أو Plus)modifierBهو شكل الجهاز (مثل الراديو)modifierCهي المنطقة، التي يمكن أن تكون عامة (مثل NA أو EMEA أو CHN) أو خاصة ببلد أو لغة (مثل 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
تحتوي حزمة 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 الحالة التي يُتوقّع أن يكون عليها الجهاز بعد تثبيت حزمة 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.
على الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android أو إصدار أحدث، يمكنك استخدام العلامة --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.