از تنظیمات پیکربندی زیر به عنوان پایه ای برای پیکربندی هسته اندروید استفاده کنید. تنظیمات در فایلهای .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
) پیدا کنید.
پیکربندی رم پایین
هسته و 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>