تنفيذ Bootconfig في Android 12

في Android 12، تحل ميزة bootconfig محل androidboot.* خيارات cmdline للنواة المستخدَمة في Android 11 والإصدارات الأقدم. ميزة bootconfig هي آلية لتمرير تفاصيل الإعدادات من الإصدار ومُشغِّل الإقلاع إلى Android 12.

توفّر هذه الميزة طريقة لفصل مَعلمات الضبط الخاصة بمساحة مستخدم Android عن مَعلمات الضبط الخاصة بالنواة. يؤدي نقل مَعلمات androidboot.* kernel الطويلة إلى ملف bootconfig إلى توفير مساحة في cmdline للنواة وإتاحتها للتوسيع في المستقبل.

يجب أن تتوافق كل من النواة ومساحة المستخدم في Android مع bootconfig.

  • أوّل إصدار يتيح هذا الإجراء: Android 12
  • أول إصدار من النواة يتيح هذا الإجراء: نواة 12-5.4.xx

تنفيذ ميزة التمهيد للأجهزة الجديدة التي تعمل بنظام تشغيل من 12 إلى 5.10.xx إصدار النواة. ولا تحتاج إلى تنفيذها في حال ترقية الأجهزة.

الأمثلة والمصدر

عند عرض الأمثلة والرموز المصدر في هذا القسم، يُرجى ملاحظة أنّ تنسيق رمز bootconfig يختلف قليلاً عن تنسيق cmdline للنواة المستخدَم في Android 11 والإصدارات الأقدم. ومع ذلك، يعد الاختلاف التالي مهمًا لاستخدامك:

  • يجب فصل المعلَمات بتسلسل إلغاء السطر الجديد \n، وليس المسافات.

مثال على برنامج الإقلاع

للحصول على مثال على أداة تحميل البرامج، يُرجى الاطّلاع على أداة تحميل البرامج المرجعية Cuttlefish U-boot implementation. في ما يلي تعهدان في المرجع. الارتفاعات الأولى يدعم إصدار رأس التشغيل إلى أحدث إصدار. في المثال، الالتزام بتحديثات (أو رفع) دعم الإصدار إلى الإصدار التالي، الإصدار 4. ينفِّذ الإجراء الثاني عمليتين: يضيف معالجة bootconfig ويوضّح إضافة المَعلمات أثناء التشغيل:

مثال على الإصدار

في ما يتعلق بمثال إصدار يعرض تغييرات mkbootimg لإنشاء vendor_boot.img مع الإصدار 4 من رأس تشغيل المورّد، يُرجى الاطّلاع على mkbootimg changes for bootconfig. اطّلِع على التغييرات في Cuttlefish لتنفيذ ما يلي:

التنفيذ

على الشركاء إضافة الدعم إلى برامج الإقلاع ونقل وقت الإنشاء مَعلمات "androidboot.*" من kernel cmdline إلى Bootconfig الملف. وأفضل طريقة لتنفيذ هذا التغيير هي إجراء ذلك بشكل تدريجي؛ اطّلِع على قسم التنفيذ والتحقّق المتزايد للحصول على معلومات حول اتباع عملية تدريجية.

إذا كانت لديك تغييرات تبحث في ملف ‎/proc/cmdline عن مَعلمات androidboot.* ، حدِّدها على ملف /proc/bootconfig بدلاً من ذلك. ro.boot.* يتم ضبط الخصائص باستخدام قيم bootconfig الجديدة، لذلك لن تحتاج إلى التغييرات في التعليمات البرمجية باستخدام هذه الخصائص.

إجراء التغييرات

أولاً، عليك ترقية إصدار رأس التشغيل إلى الإصدار 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

أضِف المَعلمة bootconfig kernel cmdline. يؤدي ذلك إلى بحث kernel عن قسم bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

يتم إنشاء مَعلمات bootconfig من المَعلمات الواردة في المتغيّر BOARD_BOOTCONFIG، تمامًا مثل إنشاء cmdline للنواة من BOARD\_KERNEL\_CMDLINE.

يمكن نقل أيّ مَعلمات androidboot.* كما هي، على النحو التالي:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

تغييرات في برنامج الإقلاع

يعمل برنامج الإقلاع على إعداد initramfs قبل الانتقال إلى النواة على الإنترنت. تسمح لك النواة إعدادات التشغيل وتبحث عن قسم Bootconfig، وتبحث عن أنها في نهاية initramfs, مع المقطع الدعائي المتوقّع.

يحصل مشغّل الإقلاع على معلومات تنسيق vendor_boot.img من عنوان صورة الإقلاع الخاصة بالمورّد.

مخطّط بياني لعملية تخصيص الذاكرة التي تم ضبطها قبل إطلاقها

الشكل 1. تخصيص ذاكرة bootconfig في Android 12

ينشئ مشغّل الإقلاع قسم bootconfig في الذاكرة. قسم Bootconfig على تخصيصات الذاكرة لما يلي:

  • المعلمات
  • حجم 4 مليار parameters size
  • حجم 4 مليار parameters checksum
  • 12 سلسلة bootconfig السحرية (#BOOTCONFIG\n)

تأتي المعاملات من مصدرين: المَعلمات المعروفة في وقت الإصدار. غير المعروفة في وقت الإنشاء. يجب إضافة مَعلمات غير معروفة.

يتم تجميع المَعلمات المعروفة في وقت الإصدار في نهاية vendor_boot. صورة في قسم Bootconfig. يتم تخزين حجم القسم (بالبايت). في حقل رأس تشغيل البائع vendor_bootconfig_size.

ولا تُعرف المعلمات غير المعروفة في وقت الإصدار إلا في وقت التشغيل في برنامج الإقلاع. يجب إضافة هذه المَعلمات إلى نهاية قسم مَعلمات bootconfig قبل تطبيق المقطع ذي الصلة بملف bootconfig.

إذا كنت بحاجة إلى إضافة أي معلمات بعد تطبيق المقطع الدعائي لـ Bootconfig، استبدال المقطع الدعائي وإعادة تطبيقه

التنفيذ والتحقّق من الصحة بشكل تدريجي

نفِّذ ميزة bootconfig بشكل تدريجي باتّباع العملية الموضّحة في هذا القسم. اترك معلمات kernel cmdline دون تغيير أثناء تتم إضافة معلمات Bootconfig.

في ما يلي خطوات التنفيذ المتزايد، مع التحقّق من الصحة:

  1. أجرِ برنامج الإقلاع وأنشئ التغييرات، ثم نفِّذ ما يلي:
    1. استخدِم المتغيّر BOARD_BOOTCONFIG لإضافة مَعلمة bootconfig جديدة.
    2. يجب إبقاء مَعلمات cmdline للنواة كما هي، لكي يتمكن الجهاز من مواصلة عملية التمهيد بشكل صحيح. ويسهّل ذلك debugging وvalidation بكثير.
  2. تحقق من عملك من خلال التحقق من محتوى /proc/bootconfig. إثبات الهوية ستظهر لك المَعلمة المضافة حديثًا بعد تشغيل الجهاز.
  3. نقل مَعلمات androidboot.* من kernel cmdline إلى Bootconfig، باستخدام المتغير BOARD_BOOTCONFIG وبرنامج الإقلاع.
  4. تحقَّق من توفّر كل مَعلمة في /proc/bootconfig ومن أنّه لم يتم تضمينها في /proc/cmdline. إذا كان بإمكانك التحقّق من ذلك، يعني ذلك أنّ عملية التنفيذ قد تمت بنجاح.

اعتبارات الترقية والرجوع إلى إصدار سابق من "وكالات السفر على الإنترنت"

عندما تدير الترقيات عبر الهواء والرجوع إلى الإصدارات السابقة من يجب توخي الحذر خاصّة من خلال نظام التشغيل Android أو إصدارات النواة المختلفة.

Android 12 هو أول إصدار يتضمّن تهيئة والدعم. في حالة الرجوع إلى أي إصدار سابق، فإن معلمات kernel cmdline يجب استخدامه بدلاً من Bootconfig.

تتوافق إصدارات kernel من 12-5.4 والإصدارات الأحدث مع bootconfig. في حال الرجوع إلى إصدار سابق إلى أي إصدار قبل ذلك (بما في ذلك 11-5.4)، يجب استخدام مَعلمات cmdline للنواة .

يمكن إجراء عمليات ترقية من نظام التشغيل Android 11 والإصدارات الأقدم إلى Android 12 والإصدارات الأحدث لمواصلة استخدام التطبيقات. معلمات kernel cmdline. وينطبق الأمر نفسه على ترقية إصدارات النواة.

تحديد المشاكل وحلّها

عند تنفيذ خطوة التحقّق، إذا لم تظهر لك المَعلمات المتوقّعة في /proc/bootconfig، تحقّق من سجلّات kernel في logcat. هناك دائمًا سجل وجود إدخال لتكوين التمهيد إذا كانت الكيرنل (النواة) تدعمه.

مثال على ناتج السجلّ

$ adb logcat | grep bootconfig
02-24 17:00:07.610     0     0 I Load bootconfig: 128 bytes 9 nodes

في حالة عرض سجل أخطاء، فإن هناك مشكلة في تحميل Bootconfig. للاطّلاع على أنواع الأخطاء المختلفة، اطّلِع علىملف init/main.c.