تنفيذ bootconfig في Android 12

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

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

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

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

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

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

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

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

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

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

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

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

التنفيذ

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

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

تغييرات الإصدار

أولاً، عليك ترقية إصدار عنوان التمهيد إلى الإصدار 4:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

أضِف مَعلمة cmdline لنظام التشغيل bootconfig. يؤدي ذلك إلى بحث kernel عن قسم 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

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

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

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

مخطّط بياني لتخطيط تخصيص الذاكرة في bootconfig

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

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

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

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

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

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

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

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

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

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

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

اعتبارات الترقية والرجوع إلى إصدار سابق من خلال التحديث عبر الهواء

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

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

تدعم إصدارات النواة 12 إلى 5.4 والإصدارات الأحدث التكوين. في حال الرجوع إلى إصدار سابق إلى أي إصدار قبل ذلك(بما في ذلك 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.