پیاده‌سازی bootconfig در Android 12

در Android 12، ویژگی bootconfig جایگزین گزینه‌های androidboot.* kernel cmdline می‌شود که در Android 11 و نسخه‌های پایین‌تر استفاده می‌شود. ویژگی bootconfig مکانیزمی برای انتقال جزئیات پیکربندی از ساخت و bootloader به Android 12 است.

این ویژگی راهی برای جدا کردن پارامترهای پیکربندی برای فضای کاربر Android از پارامترهای هسته ارائه می‌دهد. انتقال پارامترهای طولانی هسته androidboot.* به فایل bootconfig باعث ایجاد فضا در cmdline هسته می‌شود و آن را برای گسترش در آینده دردسترس قرار می‌دهد.

هم هسته و هم فضای کاربر Android باید از bootconfig پشتیبانی کنند.

  • اولین نسخه پخش که از این پشتیبانی برخوردار است: Android 12
  • اولین نسخه هسته که از این پشتیبانی برخوردار است: هسته ‎۱۲-۵.۴.xx

ویژگی bootconfig را برای دستگاه‌های جدیدی که با نسخه هسته 12-5.10.xx راه‌اندازی می‌شوند پیاده‌سازی کنید. اگر درحال ارتقا دادن دستگاه‌ها هستید، نیازی به پیاده‌سازی آن ندارید.

مثال‌ها و منبع

همان‌طور که نمونه‌ها و کد منبع را در این بخش مشاهده می‌کنید، توجه داشته باشید که قالب کد bootconfig فقط کمی با قالب خط فرمان هسته استفاده‌شده در Android 11 و نسخه‌های پایین‌تر متفاوت است. بااین‌حال، تفاوت زیر برای استفاده شما مهم است:

  • پارامترها باید با توالی گریز خط جدید \n از هم جدا شوند، نه با فاصله.

نمونه راه‌انداز سیستم

برای نمونه راه‌انداز سیستم، به پیاده‌سازی راه‌انداز سیستم مرجع Cuttlefish U-boot مراجعه کنید. دو تعهد در مرجع در زیر فهرست شده است. اولین به‌روزرسانی پشتیبانی نسخه سرصفحه را به جدیدترین نسخه ارتقا می‌دهد. در این مثال، اولین تعهد پشتیبانی نسخه را به نسخه بعدی، v4، به‌روزرسانی (یا ارتقا) می‌دهد. دومی دو کار انجام می‌دهد؛ مدیریت bootconfig را اضافه می‌کند و افزودن پارامترها در زمان اجرا را نشان می‌دهد:

نمونه ساخت

برای دیدن نمونه ساختمانی که mkbootimg تغییر برای ساختن vendor_boot.img با سرایند راه‌اندازی فروشنده نسخه ۴ را نشان می‌دهد، به mkbootimg changes for bootconfig مراجعه کنید. برای انجام کارهای زیر، تغییرات Cuttlefish را ببینید:

پیاده‌سازی

شرکا باید از بارکننده‌های راه‌اندازی خود پشتیبانی کنند و پارامترهای زمان ساخت androidboot.* را از خط فرمان هسته به فایل bootconfig منتقل کنند. بهترین راه برای پیاده‌سازی این تغییر، انجام آن به‌صورت تدریجی است؛ برای اطلاعات بیشتر درباره دنبال کردن یک فرایند تدریجی، به بخش پیاده‌سازی و اعتبارسنجی تدریجی مراجعه کنید.

اگر تغییراتی دارید که فایل /proc/cmdline را برای androidboot.* پارامترها جستجو می‌کند، آن‌ها را به‌جای آن به فایل /proc/bootconfig هدایت کنید. ویژگی‌های ro.boot.* با مقادیر جدید bootconfig تنظیم شده است، بنابراین نیازی نیست برای کدی که از این ویژگی‌ها استفاده می‌کند تغییری ایجاد کنید.

ساختن تغییرات

ابتدا، نسخه سرصفحه راه‌اندازی را به نسخه ۴ ارتقا دهید:

- BOARD_BOOT_HEADER_VERSION := 3

+ BOARD_BOOT_HEADER_VERSION := 4

پارامتر خط فرمان هسته bootconfig را اضافه کنید. با این کار، هسته به‌دنبال بخش bootconfig می‌گردد:

BOARD_KERNEL_CMDLINE += bootconfig

پارامترهای bootconfig از پارامترهای موجود در متغیر BOARD_BOOTCONFIG ایجاد می‌شوند، درست مانند cmdline هسته که از BOARD\_KERNEL\_CMDLINE ایجاد می‌شود.

هریک از پارامترهای androidboot.* را می‌توان همان‌گونه که هست منتقل کرد، مشابه با موارد زیر:

- BOARD_KERNEL_CMDLINE += androidboot..selinux=enforcing

+ BOARD_BOOTCONFIG += androidboot..selinux=enforcing

تغییرات راه‌انداز سیستم

بارگذار بوت initramfs را قبل‌از پرش به هسته راه‌اندازی می‌کند. پیکربندی راه‌اندازی هسته بخش bootconfig را جستجو می‌کند و انتظار دارد که این بخش در انتهای initramfs, با پیش‌پرده موردانتظار قرار داشته باشد.

راه‌انداز سیستم اطلاعات چیدمان vendor_boot.img را از سرایند تصویر راه‌اندازی فروشنده دریافت می‌کند.

نمودار چیدمان تخصیص حافظه bootconfig

شکل ۱. تخصیص حافظه پیکربندی راه‌اندازی Android 12

بارکننده بخش bootconfig را در حافظه ایجاد می‌کند. بخش bootconfig حاوی تخصیص‌های حافظه برای موارد زیر است:

  • پارامترها
  • اندازه 4 B parameters size
  • ‫۴ اندازه B parameters checksum
  • رشته جادویی ۱۲ بایتی bootconfig (#BOOTCONFIG\n)

پارامترها از دو منبع می‌آیند: پارامترهای شناخته‌شده در زمان ساخت، و پارامترهایی که در زمان ساخت شناخته‌شده نیستند. پارامترهای ناشناخته باید اضافه شوند.

پارامترهای شناخته‌شده در زمان ساخت در انتهای vendor_boot تصویر در بخش bootconfig بسته‌بندی می‌شوند. اندازه بخش (به‌صورت بایت) در فیلد سرایند راه‌اندازی فروشنده vendor_bootconfig_size ذخیره می‌شود.

پارامترهایی که در زمان ساخت مشخص نیستند، فقط در زمان اجرا در بوت‌لودر مشخص می‌شوند. این موارد باید به انتهای بخش پارامترهای bootconfig قبل‌از اعمال تریلر bootconfig اضافه شوند.

اگر لازم است پارامترهایی را بعداز اعمال شدن تریلر bootconfig اضافه کنید، تریلر را رونویسی کنید و دوباره آن را اعمال کنید.

پیاده‌سازی و اعتبارسنجی افزایشی

ویژگی bootconfig را به‌صورت افزایشی با دنبال کردن فرایند ارائه‌شده در این بخش پیاده‌سازی کنید. پارامترهای خط فرمان هسته را دست‌نخورده بگذارید و پارامترهای bootconfig را اضافه کنید.

مراحل پیاده‌سازی افزایشی با اعتبارسنجی به شرح زیر است:

  1. تغییرات بوت‌لودر و ساخت را ایجاد کنید، سپس کارهای زیر را انجام دهید:
    1. از متغیر BOARD_BOOTCONFIG برای افزودن پارامتر bootconfig جدید استفاده کنید.
    2. پارامترهای cmdline هسته را همان‌طور که هستند نگه دارید تا دستگاه بتواند به‌درستی راه‌اندازی شود. این کار اشکال‌زدایی و اعتبارسنجی را بسیار آسان‌تر می‌کند.
  2. با بررسی محتوای /proc/bootconfig، کارتان را درستی‌سنجی کنید. پس‌از بوت شدن دستگاه، درستی‌سنجی کنید که پارامتر جدید اضافه شده را می‌بینید.
  3. بااستفاده از متغیر BOARD_BOOTCONFIG و بارکننده، پارامترهای androidboot.* را از خط فرمان هسته به bootconfig منتقل کنید.
  4. تأیید کنید که هریک از پارامترها در /proc/bootconfig وجود دارد و در /proc/cmdline نیست. اگر بتوانید این را درستی‌سنجی کنید، پیاده‌سازی شما موفقیت‌آمیز بوده است.

ملاحظات ارتقا و تنزل ازطریق هوا

هنگام مدیریت ارتقا و تنزل OTA بین نسخه‌های مختلف Android یا نسخه‌های مختلف هسته، باید دقت ویژه‌ای داشته باشید.

‫Android 12 اولین نسخه‌ای است که از bootconfig پشتیبانی می‌کند. اگر به نسخه‌ای قبل‌از آن تنزل دهید، باید به‌جای bootconfig از پارامترهای خط فرمان هسته استفاده کنید.

نسخه‌های هسته ۱۲-۵.۴ و نسخه‌های جدیدتر از bootconfig پشتیبانی می‌کنند. اگر به هر نسخه‌ای قبل‌از آن(ازجمله ۱۱-۵.۴) تنزل می‌دهید، باید از پارامترهای خط فرمان هسته استفاده شود.

ارتقا از Android 11 و نسخه‌های پایین‌تر به Android 12 و نسخه‌های بالاتر می‌تواند همچنان از پارامترهای خط فرمان هسته استفاده کند. همین امر برای ارتقا دادن نسخه‌های هسته نیز صادق است.

عیب‌یابی

وقتی مرحله درستی‌سنجی را انجام می‌دهید، اگر پارامترهای موردانتظار را در /proc/bootconfig نمی‌بینید، گزارش‌های هسته را در logcat بررسی کنید. اگر هسته از پیکربندی راه‌اندازی پشتیبانی کند، همیشه یک ورودی گزارش برای آن وجود دارد.

خروجی گزارش نمونه

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

اگر گزارش خطایی را مشاهده کردید، یعنی در بار کردن bootconfig مشکلی وجود داشته است. برای دیدن انواع مختلف خطا، init/main.c را مشاهده کنید.