پیاده سازی Bootconfig در اندروید 12

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

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

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

  • اولین نسخه ای که این پشتیبانی را دارد: اندروید 12
  • اولین نسخه هسته ای که این پشتیبانی را دارد: هسته 12-5.4.xx

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

مثال ها و منبع

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

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

مثال بوت لودر

برای مثال بوت لودر، اجرای بوت لودر مرجع Cuttlefish U-boot را ببینید. دو commit در مرجع در زیر فهرست شده است. اولین نسخه پشتیبانی از نسخه هدر بوت را به آخرین نسخه ارتقا می دهد. در مثال، اولین commit پشتیبانی از نسخه را به نسخه بعدی، v4، به روز می کند (یا uprev). دومی دو کار انجام می دهد. هندلینگ بوت کانفیگ را اضافه می کند و اضافه کردن پارامترها را در زمان اجرا نشان می دهد:

نمونه ساخت

برای مثال ساختنی که تغییرات mkbootimg را برای ساخت vendor_boot.img با هدر بوت فروشنده v4 نشان می‌دهد، 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 را اضافه کنید. این باعث می شود که هسته به دنبال بخش 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 را از سربرگ تصویر بوت فروشنده دریافت می کند.

Diagram of bootconfig memory allocation layout

شکل 1. تخصیص حافظه bootconfig اندروید 12

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

  • مولفه های
  • 4 اندازه B parameters size
  • 4 parameters checksum اندازه B
  • رشته جادویی 12 B bootconfig ( #BOOTCONFIG\n )

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

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

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

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

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

با دنبال کردن فرآیند ارائه شده در این بخش، ویژگی bootconfig را به صورت تدریجی پیاده سازی کنید. در حالی که پارامترهای bootconfig اضافه می شوند، پارامترهای cmdline هسته را دست نخورده بگذارید.

این مراحل برای اجرای تدریجی، با اعتبارسنجی است:

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

ملاحظات ارتقا و تنزل رتبه OTA

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

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

نسخه های هسته 12-5.4 و نسخه های بعدی از bootconfig پشتیبانی می کنند. در صورت تنزل دادن به هر نسخه ای قبل از آن (از جمله 11-5.4)، باید از پارامترهای cmdline هسته استفاده شود.

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

عیب یابی

وقتی مرحله تأیید را انجام می‌دهید، اگر پارامترهای مورد انتظار را در /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 را مشاهده کنید.