تنفيذ Bootconfig في Android 12

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

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

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

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

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

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

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

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

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

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

بناء المثال

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

تطبيق

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

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

بناء التغييرات

أولاً، قم بتحديث إصدار رأس التمهيد الخاص بك إلى الإصدار 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

قم بإضافة معلمة cmdline لـ bootconfig kernel. وهذا يجعل النواة تبحث عن قسم تكوين التمهيد:

BOARD_KERNEL_CMDLINE += bootconfig

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

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

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

تغييرات محمل الإقلاع

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

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

Diagram of bootconfig memory allocation layout

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

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

  • حدود
  • 4 parameters size الحجم B
  • 4 الحجم parameters checksum الحجم B
  • 12 ب سلسلة سحرية لتكوين التمهيد ( #BOOTCONFIG\n )

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

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

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

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

التنفيذ المتزايد والتحقق من الصحة

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

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

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

اعتبارات ترقية OTA وتخفيضها

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

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

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

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

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

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

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

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

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