تنفيذ bootconfig في Android 12

في 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 يختلف قليلاً عن تنسيق سطر الأوامر الخاص بالنواة المستخدَم في الإصدار 11 من نظام التشغيل Android والإصدارات الأقدم. ومع ذلك، من المهم معرفة الفرق التالي عند استخدام هذه الميزة:

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

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

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

مثال على الإنشاء

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

التنفيذ

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

إذا كانت لديك تغييرات تبحث في الملف /proc/cmdline عن androidboot.* مَعلمات، وجِّهها إلى الملف /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, مع التذييل المتوقّع.

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

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

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

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

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

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

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

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

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

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

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

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

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

اعتبارات الترقية والرجوع إلى إصدار سابق من خلال OTA

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

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

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

يمكن للمستخدمين الذين يترقّون من الإصدار 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.