پیکربندی هسته

از تنظیمات پیکربندی زیر به عنوان پایه ای برای پیکربندی هسته اندروید استفاده کنید. تنظیمات در فایل‌های .cfg برای android-base ، android-base- ARCH و android-recommended سازماندهی می‌شوند:

  • گزینه‌های android-base ویژگی‌های اصلی Android را فعال می‌کنند و باید همانطور که توسط همه دستگاه‌ها مشخص شده است پیکربندی شوند.
  • گزینه‌های android-base- ARCH ویژگی‌های اصلی Android را فعال می‌کنند و باید همانطور که توسط همه دستگاه‌های معماری ARCH مشخص شده است پیکربندی شوند. همه معماری ها یک فایل متناظر از گزینه های مورد نیاز خاص معماری ندارند. اگر معماری شما فایلی ندارد، نیازی به پیکربندی هسته خاص معماری برای اندروید ندارد.
  • android-recommended . این گزینه‌ها ویژگی‌های پیشرفته اندروید را فعال می‌کنند و برای دستگاه‌ها اختیاری هستند.

این فایل های پیکربندی در مخزن kernel/configs قرار دارند. از مجموعه فایل های پیکربندی که با نسخه هسته ای که استفاده می کنید مطابقت دارد استفاده کنید.

برای جزئیات در مورد کنترل‌هایی که قبلاً برای تقویت هسته در دستگاه‌های شما انجام شده‌اند، به امنیت سیستم و هسته مراجعه کنید. برای جزئیات در مورد تنظیمات مورد نیاز، به سند تعریف سازگاری Android (CDD) مراجعه کنید.

پیکربندی هسته را ایجاد کنید

برای دستگاه هایی که فرمت defconfig مینیمالیستی دارند، از اسکریپت merge_config.sh در درخت هسته استفاده کنید تا گزینه ها را فعال کنید:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

این یک فایل .config ایجاد می کند که می توانید از آن برای ذخیره یک فایل defconfig جدید یا کامپایل یک هسته جدید با فعال بودن ویژگی های Android استفاده کنید.

نیازهای اضافی پیکربندی هسته

در برخی موارد، نگهدارنده پلتفرم می‌تواند از بین چندین ویژگی هسته برای ارضای وابستگی اندروید انتخاب کند. چنین وابستگی‌هایی را نمی‌توان در فایل‌های قطعه پیکربندی هسته (که در بالا توضیح داده شد) بیان کرد، زیرا قالب آن فایل‌ها از عبارات منطقی پشتیبانی نمی‌کند. در Android 9 و بالاتر، مجموعه تست سازگاری (CTS) و مجموعه تست فروشنده (VTS) تأیید می‌کنند که شرایط زیر برآورده می‌شوند:

  • CONFIG_OF=y یا CONFIG_ACPI=y
  • هسته های 4.4 و 4.9 دارای CONFIG_ANDROID_LOW_MEMORY_KILLER=y هستند یا هر دو CONFIG_MEMCG=y و CONFIG_MEMCG_SWAP=y دارند.
  • CONFIG_DEBUG_RODATA=y یا CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y یا CONFIG_STRICT_MODULE_RWX=y
  • فقط برای ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y یا CONFIG_ARM64_PAN=y

علاوه بر این، گزینه CONFIG_INET_UDP_DIAG باید برای 4.9 هسته در اندروید 9 و بالاتر روی y تنظیم شود.

گزینه های حالت میزبان USB را فعال کنید

برای صدای حالت میزبان USB، گزینه های زیر را فعال کنید:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

برای حالت میزبان USB MIDI، گزینه زیر را فعال کنید:

CONFIG_SND_USB_MIDI=y

Seccomp BPF با TSYNC

فیلتر بسته محاسباتی ایمن برکلی (Seccomp BPF) یک فناوری امنیتی هسته است که امکان ایجاد جعبه‌های شنی را فراهم می‌کند که زمینه را تعریف می‌کنند که در آن فرآیند ممکن است تماس‌های سیستمی را برقرار کند. ویژگی همگام سازی نخ (TSYNC) استفاده از Seccomp BPF را از برنامه های چند رشته ای امکان پذیر می کند. این توانایی محدود به معماری‌هایی است که از Seccomp پشتیبانی می‌کنند (ARM، ARM64، x86، و x86_64).

دیمون قفل زنده اندروید

اندروید 10 شامل دیمون قفل زنده اندروید ( llkd ) است که برای گرفتن و کاهش بن بست های هسته طراحی شده است. برای جزئیات بیشتر در مورد استفاده از llkd ، به دیمون قفل زنده Android مراجعه کنید.

vDSO32 در ARM64

شی مشترک پویا مجازی (vDSO) جایگزینی برای فراخوانی سیستم است که در صورت استفاده و پیکربندی صحیح می تواند هزینه های چرخه را کاهش دهد. اندروید 10 پشتیبانی از vDSO32 را در هسته های 64 بیتی اضافه می کند (اندروید از قبل از vDSO64 در هسته های 64 بیتی و vDSO32 در هسته های 32 بیتی پشتیبانی می کند). استفاده از vDSO32 ( CONFIG_VDSO_COMPAT ) در معماری ARM64 باعث افزایش 0.4 درصدی عمر باتری و سایر بهبودهای عملکرد می شود.

جامعه لینوکس فعالانه روی یکپارچه سازی vDSO ها در معماری ها کار می کند. با فعال کردن vDSO32 با CONFIG_COMPAT و CONFIG_CROSS_COMPILE_COMPAT_VDSO با سه گانه کامپایلر arm32 می توانید vDSO را در هسته لینوکس خود راه اندازی کنید. تیم Android Kernel نسخه‌های قدیمی‌تری از سری وصله‌های vDSO را در دستگاه‌های Pixel پشتیبان‌گیری کرده است، بنابراین می‌توانید نمونه‌هایی را در ساخت‌های هسته Pixel (مسیر LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN ، مرجع CROSS_COMPILE_ARM32 و CONFIG_CROSS_COMPILE_ARM32 configLE_COMPILE_COMPILE_COMPILE_COMPILE) پیدا کنید.

پیکربندی رم پایین

هسته و ActivityManager را تنظیم کنید تا بازیابی مستقیم را کاهش دهید

بازیابی مستقیم زمانی اتفاق می‌افتد که یک پردازش یا هسته سعی می‌کند یک صفحه از حافظه را اختصاص دهد (به طور مستقیم یا به دلیل نقص در صفحه جدید) و هسته از تمام حافظه آزاد موجود استفاده کرده باشد. این امر مستلزم آن است که هسته تخصیص را مسدود کند در حالی که یک صفحه را آزاد می کند. این به نوبه خود اغلب به ورودی/خروجی دیسک نیاز دارد تا یک صفحه کثیف پشتیبان شده از فایل را پاک کند یا منتظر lowmemorykiller باشد تا فرآیندی را متوقف کند. این می تواند منجر به I/O اضافی در هر رشته، از جمله یک رشته UI شود.

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

آستانه پیش‌فرض برای شروع بازیابی پس‌زمینه نسبتاً پایین است، حدود 2 مگابایت در دستگاه 2 گیگابایتی و 636 کیلوبایت در دستگاه 512 مگابایتی. هسته تنها چند مگابایت حافظه را در پس‌زمینه بازیابی می‌کند. این بدان معناست که هر فرآیندی که به سرعت بیش از چند مگابایت را تخصیص دهد، به سرعت به بازیابی مستقیم خواهد رسید.

پشتیبانی از یک هسته قابل تنظیم در شاخه هسته Android-3.4 به عنوان پچ 92189d47f66c67e5fd92eafaa287e153197a454f ("افزودن کیلوبایت رایگان اضافی قابل تنظیم") اضافه شده است. انتخاب این وصله در هسته دستگاه به ActivityManager اجازه می دهد تا به هسته بگوید سعی کند سه بافر تمام صفحه 32 bpp از حافظه را خالی نگه دارد.

این آستانه ها را می توان با چارچوب config.xml پیکربندی کرد.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists). A high value increases the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller. Overrides the default value chosen by ActivityManager based
on screen size. 0 prevents keeping any extra memory over what the kernel keeps
by default. -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists). 0 uses the default value chosen by
ActivityManager. A positive value increases the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier. A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller. Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

LowMemoryKiller را تنظیم کنید

ActivityManager آستانه های LowMemoryKiller را به گونه ای پیکربندی می کند که با انتظارات آن از مجموعه کاری صفحات پشتیبان فایل (صفحات کش) مورد نیاز برای اجرای فرآیندها در هر سطل سطح اولویت، مطابقت داشته باشد. اگر دستگاهی نیازهای بالایی برای مجموعه کاری داشته باشد، به عنوان مثال اگر رابط کاربری فروشنده به حافظه بیشتری نیاز دارد یا اگر خدمات بیشتری اضافه شده باشد، آستانه ها را می توان افزایش داد.

اگر حافظه بیش از حد برای صفحات پشتیبان فایل ذخیره شده باشد، آستانه ها را می توان کاهش داد، به طوری که فرآیندهای پس زمینه مدت ها قبل از اینکه دیسک thrashing رخ دهد به دلیل کوچک شدن حافظه نهان از بین می رود.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel. A high value causes the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory. A low value keeps more
processes in memory but may cause thrashing if set too low. Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets. -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel. A high value causes the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory. A low value
keeps more processes in memory but may cause thrashing if set too low. Directly
added to the default value chosen by ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>