تنفيذ Bootconfig في Android 12

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

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

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

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

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

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

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

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

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

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

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

للحصول على مثال على إصدار يعرض تغييرات mkbootimg لإنشاء vendor_boot.img مع الإصدار 4 من رأس تشغيل المورّد، يمكنك الاطّلاع على 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. هذا يجعل النواة تبحث عن قسم التكوين:

BOARD_KERNEL_CMDLINE += bootconfig

يتم إنشاء معلَمات Bootconfig من المَعلمات في المتغيّر BOARD_BOOTCONFIG، كما يتم إنشاء kernel cmdline من BOARD\_KERNEL\_CMDLINE.

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

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

التغييرات التي طرأت على برنامج الإقلاع

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

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

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

الشكل 1. تخصيص الذاكرة التي تم ضبطها لتمهيد بدء نظام التشغيل Android 12

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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