از تنظیمات پیکربندی زیر به عنوان پایه ای برای پیکربندی هسته اندروید استفاده کنید. تنظیمات در فایلهای .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=CONFIG_MEMCG=y
و CONFIG_MEMCG_SWAP=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).
Android Live-Lock Daemon
Android 10 شامل Android Live-Lock Daemon ( llkd
) است که برای گرفتن و کاهش بن بست های هسته طراحی شده است. برای جزئیات استفاده از llkd
، به Android Live-Lock Daemon مراجعه کنید.
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 will increase 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 will increase 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 will cause 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 will keep 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 will cause 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 will keep 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>