في Android 12، تحلّ ميزة bootconfig محلّ خيارات سطر الأوامر في النواة androidboot.* المستخدَمة في Android 11 والإصدارات الأقدم. ميزة bootconfig هي آلية لنقل تفاصيل الإعداد من الإصدار وبرنامج الإقلاع إلى Android 12.
توفّر هذه الميزة طريقة لفصل مَعلمات الإعداد لمساحة مستخدم Android عن مَعلمات النواة. إنّ نقل مَعلمات النواة الطويلة androidboot.* إلى ملف bootconfig يوفّر مساحة على سطر الأوامر في النواة ويجعلها متاحة للتوسيع في المستقبل.
يجب أن تتوافق النواة ومساحة مستخدم Android مع bootconfig.
- أول إصدار يتوافق مع هذه الميزة: Android 12
- أول إصدار من النواة يتوافق مع هذه الميزة: النواة 12-5.4.xx
يمكنك تنفيذ ميزة bootconfig للأجهزة الجديدة التي يتم طرحها بإصدار النواة 12-5.10.xx. ولست بحاجة إلى تنفيذها إذا كنت بصدد ترقية الأجهزة.
الأمثلة والمصدر
أثناء الاطّلاع على الأمثلة ورمز المصدر في هذا القسم، يُرجى العِلم أنّ تنسيق رمز bootconfig يختلف قليلاً فقط عن تنسيق سطر الأوامر في النواة المستخدَم في Android 11 والإصدارات الأقدم.
ومع ذلك، فإنّ الاختلاف التالي مهم لاستخدامك:
- يجب فصل المَعلمات باستخدام تسلسل الأحرف
\nللانتقال إلى سطر جديد، وليس باستخدام المسافات.
مثال على برنامج الإقلاع
للاطّلاع على مثال على برنامج الإقلاع، يُرجى الرجوع إلى تنفيذ برنامج الإقلاع المرجعي في Cuttlefish U-boot. في ما يلي عمليتان إرسال في المرجع. تؤدي العملية الأولى إلى ترقية دعم إصدار رأس الإقلاع إلى أحدث إصدار. في المثال، تؤدي العملية الأولى إلى تعديل (أو ترقية) دعم الإصدار إلى الإصدار التالي، أي الإصدار v4. تنفّذ العملية الثانية إجراءَين: إضافة معالجة bootconfig، وعرض كيفية إضافة مَعلمات في وقت التشغيل:
مثال على الإصدار
للاطّلاع على مثال على الإصدار يوضّح mkbootimg تغييرات لإنشاء الـ
vendor_boot.img باستخدام رأس إقلاع البائع v4، يُرجى الرجوع إلى mkbootimg changes for
bootconfig.
يُرجى الاطّلاع على تغييرات Cuttlefish لتنفيذ ما يلي:
- استخدام (أو ترقية إلى) إصدار رأس إقلاع البائع v4.
- إضافة bootconfig إلى سطر الأوامر في النواة ونقل مَعلمات محدّدة إلى bootconfig.
التنفيذ
على الشركاء إضافة دعم إلى برامج الإقلاع ونقل مَعلمات androidboot.* في وقت الإصدار من سطر الأوامر في النواة إلى ملف bootconfig. أفضل طريقة لتنفيذ هذا التغيير هي إجراؤه تدريجيًا. يُرجى الاطّلاع على قسم
التنفيذ والتحقق التدريجيَين للحصول على معلومات حول اتّباع عملية تدريجية.
إذا كانت لديك تغييرات تبحث عن مَعلمات androidboot.* في الملف /proc/cmdline، يمكنك توجيهها إلى الملف /proc/bootconfig بدلاً من ذلك. يتم ضبط خصائص ro.boot.* باستخدام قيم bootconfig الجديدة، لذا لست بحاجة إلى إجراء تغييرات على الرمز الذي يستخدم هذه الخصائص.
تغييرات الإصدار
أولاً، عليك ترقية إصدار رأس الإقلاع إلى الإصدار 4:
- BOARD_BOOT_HEADER_VERSION := 3
+ BOARD_BOOT_HEADER_VERSION := 4
أضِف مَعلمة سطر الأوامر في النواة bootconfig. يؤدي ذلك إلى بحث النواة عن قسم bootconfig:
BOARD_KERNEL_CMDLINE += bootconfig
يتم إنشاء مَعلمات bootconfig من المَعلمات في المتغيّر BOARD_BOOTCONFIG، تمامًا كما يتم إنشاء سطر الأوامر في النواة من 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 على تخصيصات الذاكرة لما يلي:
- المعلَمات
parameters sizeبحجم 4 بايتparameters checksumبحجم 4 بايت- سلسلة bootconfig السحرية (
#BOOTCONFIG\n) بحجم 12 بايت
تأتي المَعلمات من مصدرَين: المَعلمات المعروفة في وقت الإصدار والمَعلمات غير المعروفة في وقت الإصدار. يجب إضافة المَعلمات غير المعروفة.
يتم تجميع المَعلمات المعروفة في مدّة التصميم في نهاية صورة vendor_boot في قسم bootconfig. يتم تخزين حجم القسم (بالبايت) في حقل رأس إقلاع البائع vendor_bootconfig_size.
لا تكون المَعلمات غير المعروفة في مدّة التصميم معروفة إلا في وقت التشغيل في برنامج الإقلاع. يجب إضافة هذه المَعلمات إلى نهاية قسم مَعلمات bootconfig قبل تطبيق تذييل bootconfig.
إذا كنت بحاجة إلى إضافة أي مَعلمات بعد تطبيق تذييل bootconfig، يمكنك استبدال التذييل وإعادة تطبيقه.
التنفيذ والتحقق التدريجيَين
يمكنك تنفيذ ميزة bootconfig تدريجيًا باتّباع العملية الموضّحة في هذا القسم. يُرجى ترك مَعلمات سطر الأوامر في النواة بدون تغيير أثناء إضافة مَعلمات bootconfig.
في ما يلي خطوات التنفيذ التدريجي مع التحقق:
- أجرِ تغييرات برنامج الإقلاع والإصدار، ثم نفِّذ ما يلي:
- استخدِم المتغيّر
BOARD_BOOTCONFIGلإضافة مَعلمة bootconfig جديدة. - احتفِظ بمَعلمات سطر الأوامر في النواة كما هي، حتى يتمكّن الجهاز من مواصلة الإقلاع بشكلٍ صحيح. يؤدي ذلك إلى تسهيل عملية تحديد المشاكل والتحقق إلى حد كبير.
- استخدِم المتغيّر
- تحقَّق من عملك من خلال الاطّلاع على محتويات الملف
/proc/bootconfig. تأكَّد من ظهور المَعلمة التي تمت إضافتها حديثًا بعد إقلاع الجهاز. - انقُل مَعلمات
androidboot.*من سطر الأوامر في النواة إلى bootconfig، باستخدام المتغيّرBOARD_BOOTCONFIGوبرنامج الإقلاع. - تأكَّد من أنّ كل مَعلمة موجودة في
/proc/bootconfigو أنّها ليست في/proc/cmdline. إذا تمكّنت من التحقق من ذلك، يعني ذلك أنّ عملية التنفيذ ناجحة.
اعتبارات الترقية والرجوع إلى الإصدارات السابقة عبر OTA
عند إدارة عمليات الترقية والرجوع إلى الإصدارات السابقة عبر OTA بين إصدارات مختلفة من Android أو إصدارات مختلفة من النواة، يجب توخي الحذر الشديد.
Android 12 هو أول إصدار يتوافق مع ميزة bootconfig. في حال الرجوع إلى أي إصدار سابق، يجب استخدام مَعلمات سطر الأوامر في النواة بدلاً من bootconfig.
تتوافق إصدارات النواة 12-5.4 والإصدارات الأحدث مع ميزة bootconfig. في حال الرجوع إلى أي إصدار سابق(بما في ذلك 11-5.4)، يجب استخدام مَعلمات سطر الأوامر في النواة.
يمكن أن تستمر عمليات الترقية من Android 11 والإصدارات الأقدم إلى Android 12 والإصدارات الأحدث في استخدام مَعلمات سطر الأوامر في النواة. وينطبق الأمر نفسه على ترقية إصدارات النواة.
تحديد المشاكل وحلّها
عند تنفيذ خطوة التحقق ، إذا لم تظهر لك المَعلمات المتوقّعة في الملف /proc/bootconfig، يُرجى الاطّلاع على سجلّات النواة في 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.