تنفيذ Bootconfig في Android 12

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

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

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

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

  • الإصدار الأول الذي يحتوي على هذا الدعم: Android 12
  • إصدار kernel الأول الذي يحتوي على هذا الدعم: 12-5.4.xx kernel

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

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

أثناء عرض الأمثلة وكود المصدر في هذا القسم ، لاحظ أن تنسيق كود bootconfig يختلف قليلاً فقط عن تنسيق kernel cmdline المستخدم في Android 11 والإصدارات الأقدم. ومع ذلك ، فإن الاختلاف التالي مهم لاستخدامك:

  • يجب فصل المعلمات عن طريق تسلسل هروب السطر الجديد \n ، وليس بمسافات.

مثال محمل الإقلاع

للحصول على مثال محمل الإقلاع ، راجع تنفيذ أداة تحميل التمهيد المرجعي لـ Cuttlefish U-boot. يتم سرد التزامين في المرجع أدناه. أول تحديث يدعم إصدار رأس التمهيد لأحدث إصدار. في المثال ، الالتزام الأول بتحديثات (أو تحديثات) يدعم الإصدار الإصدار التالي ، v4. الثاني يفعل شيئين. يضيف معالجة bootconfig ، ويوضح إضافة معلمات في وقت التشغيل:

بناء مثال

للحصول على مثال بناء يُظهر تغييرات mkbootimg لإنشاء vendor_boot.img مع رأس تمهيد البائع v4 ، راجع mkbootimg changes for bootconfig . انظر تغييرات الحبار للقيام بما يلي:

تطبيق

يجب على الشركاء إضافة دعم إلى محمل الإقلاع ، ونقل معلمات 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. هذا يجعل النواة تبحث عن قسم bootconfig:

BOARD_KERNEL_CMDLINE += bootconfig

يتم إنشاء معلمات bootconfig من المعلمات في متغير BOARD_BOOTCONFIG ، تمامًا مثل kernel cmdline الذي يتم إنشاؤه من BOARD\_KERNEL\_CMDLINE .

يمكن نقل أي معلمات androidboot.* كما هي ، على غرار ما يلي:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

تغييرات Bootloader

يقوم برنامج bootloader بإعداد initramfs قبل القفز إلى kernel. يبحث تكوين تمهيد kernel عن قسم bootconfig ، ويبحث عنه ليكون في نهاية initramfs, مع المقطع الدعائي المتوقع.

يحصل محمل الإقلاع على معلومات تخطيط vendor_boot.img من رأس صورة تمهيد البائع.

Diagram of bootconfig memory allocation layout

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

يقوم برنامج bootloader بإنشاء قسم bootconfig في الذاكرة. يحتوي قسم bootconfig على تخصيصات ذاكرة لما يلي:

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

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

يتم تجميع المعلمات المعروفة في وقت الإنشاء في نهاية صورة vendor_boot في قسم bootconfig. يتم تخزين حجم المقطع (على هيئة بايت) في حقل عنوان تمهيد البائع vendor_bootconfig_size .

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

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

التنفيذ والتحقق التدريجي

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

هذه هي خطوات التنفيذ التدريجي ، مع التحقق من الصحة:

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

اعتبارات ترقية وخفض مستوى OTA

عند إدارة ترقيات OTA والتخفيضات بين الإصدارات المختلفة من Android ، أو إصدارات kernel المختلفة ، يجب توخي الحذر بشكل خاص.

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

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

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

استكشاف الأخطاء وإصلاحها

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

مثال إخراج السجل

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

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