استخدم إعدادات التكوين التالية كقاعدة لتكوين Android kernel. يتم تنظيم الإعدادات في ملفات .cfg
لـ android-base
و android-base- ARCH
و android-recommended
:
- تعمل خيارات
android-base
على تمكين ميزات Android الأساسية ويجب تهيئتها على النحو المحدد بواسطة جميع الأجهزة. - تعمل خيارات
android-base- ARCH
على تمكين ميزات Android الأساسية ويجب تهيئتها على النحو المحدد بواسطة جميع الأجهزة ذات البنية ARCH . لا تحتوي جميع البنيات على ملف مناظر من الخيارات المطلوبة الخاصة بالبنية. إذا كانت بنيتك لا تحتوي على ملف، فهي لا تحتوي على متطلبات تكوين kernel إضافية خاصة بالبنية لنظام Android. -
android-recommended
. تعمل هذه الخيارات على تمكين ميزات Android المتقدمة وهي اختيارية للأجهزة.
توجد ملفات التكوين هذه في kernel/configs
repo. استخدم مجموعة ملفات التكوين التي تتوافق مع إصدار النواة الذي تستخدمه.
للحصول على تفاصيل حول عناصر التحكم التي تم إجراؤها بالفعل لتعزيز النواة على أجهزتك، راجع أمان النظام والنواة . للحصول على تفاصيل حول الإعدادات المطلوبة، راجع مستند تعريف توافق Android (CDD) .
إنشاء تكوين النواة
بالنسبة للأجهزة التي تحتوي على تنسيق defconfig
البسيط، استخدم البرنامج النصي merge_config.sh
في شجرة kernel لتمكين الخيارات:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
يؤدي هذا إلى إنشاء ملف .config
يمكنك استخدامه لحفظ ملف defconfig
جديد أو تجميع نواة جديدة مع تمكين ميزات Android.
متطلبات تكوين النواة الإضافية
في بعض الحالات، يمكن لمشرف النظام الأساسي الاختيار من بين ميزات kernel المتعددة لتلبية تبعية Android. لا يمكن التعبير عن مثل هذه التبعيات في ملفات أجزاء تكوين kernel (الموصوفة أعلاه) لأن تنسيق هذه الملفات لا يدعم التعبيرات المنطقية. في 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
على y
لـ 4.9 نواة في Android 9 والإصدارات الأحدث.
تمكين خيارات وضع مضيف 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
إن Secure Computing Berkeley Packet Filter (Seccomp BPF) عبارة عن تقنية أمان kernel تتيح إنشاء صناديق حماية تحدد السياق الذي قد تقوم فيه العملية بإجراء مكالمات النظام. تتيح ميزة مزامنة مؤشر الترابط (TSYNC) استخدام Seccomp BPF من البرامج متعددة مؤشرات الترابط. تقتصر هذه القدرة على البنيات التي تدعم Seccomp المنبع (ARM وARM64 وx86 وx86_64).
برنامج Android Live-Lock الخفي
يتضمن Android 10 برنامج Android Live-Lock Daemon ( llkd
)، والذي تم تصميمه لاكتشاف حالات الجمود في kernel وتخفيفها. للحصول على تفاصيل حول استخدام llkd
، راجع Android Live-Lock Daemon .
vDSO32 على ARM64
يعد الكائن الديناميكي الظاهري المشترك (vDSO) بديلاً لاستدعاءات النظام التي يمكن أن تقلل تكاليف الدورة عند استخدامها وتكوينها بشكل صحيح. يضيف Android 10 دعمًا لـ vDSO32 على نواة 64 بت (يدعم Android بالفعل vDSO64 على نواة 64 بت وvDSO32 على نواة 32 بت). يوفر استخدام vDSO32 ( CONFIG_VDSO_COMPAT
) على بنية ARM64 زيادة بنسبة 0.4 بالمائة في عمر البطارية وتحسينات أخرى في الأداء.
يعمل مجتمع Linux بنشاط على توحيد vDSOs عبر البنيات . يمكنك إعداد vDSO في Linux kernel الخاص بك عن طريق تمكين vDSO32 مع CONFIG_COMPAT
و CONFIG_CROSS_COMPILE_COMPAT_VDSO
مع المترجم الثلاثي Arm32. قام فريق Android Kernel بنقل الإصدارات الأقدم من سلسلة تصحيحات vDSO إلى أجهزة Pixel، بحيث يمكنك العثور على أمثلة في إصدارات Pixel kernel ( مسار LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
ومرجع CROSS_COMPILE_ARM32
وتكوين CONFIG_CROSS_COMPILE_ARM32
).
تكوين ذاكرة الوصول العشوائي منخفضة
قم بضبط kernel/ActivityManager لتقليل الاسترداد المباشر
تحدث الاستعادة المباشرة عندما تحاول إحدى العمليات أو النواة تخصيص صفحة من الذاكرة (إما بشكل مباشر أو بسبب خطأ في صفحة جديدة) وقد استخدمت النواة كل الذاكرة الحرة المتوفرة. يتطلب ذلك من النواة حظر التخصيص أثناء تحرير الصفحة. وهذا بدوره يتطلب غالبًا إدخال/إخراج القرص لمسح صفحة مدعومة بملفات قذرة أو الانتظار حتى يقوم lowmemorykiller
بإيقاف العملية. يمكن أن يؤدي هذا إلى إدخال/إخراج إضافي في أي مؤشر ترابط، بما في ذلك مؤشر ترابط واجهة المستخدم.
لتجنب الاستعادة المباشرة، تحتوي النواة على علامات مائية تؤدي إلى تشغيل kswapd
أو استعادة الخلفية. هذا مؤشر ترابط يحاول تحرير الصفحات، لذا في المرة التالية التي يتم فيها تخصيص مؤشر ترابط حقيقي، يمكن أن ينجح بسرعة.
الحد الافتراضي لتشغيل استعادة الخلفية منخفض إلى حد ما، حوالي 2 ميجا بايت على جهاز 2 جيجا بايت و636 كيلو بايت على جهاز 512 ميجا بايت. تستعيد النواة بضعة ميغابايت فقط من الذاكرة في عملية استعادة الخلفية. وهذا يعني أن أي عملية تقوم بتخصيص أكثر من بضعة ميغابايت بسرعة ستحقق الاسترداد المباشر بسرعة.
تمت إضافة دعم لضبط kernel في فرع Android-3.4 kernel كتصحيح 92189d47f66c67e5fd92eafaa287e153197a454f ("أضف وحدات بايت إضافية قابلة للضبط"). يسمح انتقاء هذا التصحيح لنواة الجهاز لـ ActivityManager
بإخبار النواة بمحاولة الاحتفاظ بثلاثة مخازن مؤقتة للذاكرة بملء الشاشة تبلغ 32 بت في الثانية خالية.
يمكن تكوين هذه الحدود باستخدام إطار عمل 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
لتتوافق مع توقعاته لمجموعة العمل من الصفحات المدعومة بالملفات (الصفحات المخزنة مؤقتًا) المطلوبة لتشغيل العمليات في كل مجموعة من مستويات الأولوية. إذا كان لدى الجهاز متطلبات عالية لمجموعة العمل، على سبيل المثال، إذا كانت واجهة مستخدم البائع تتطلب المزيد من الذاكرة أو إذا تمت إضافة المزيد من الخدمات، فيمكن زيادة الحدود.
يمكن تقليل العتبات إذا تم حجز قدر كبير جدًا من الذاكرة للصفحات المدعومة بالملفات، بحيث يتم إيقاف العمليات الخلفية قبل وقت طويل من حدوث تحطيم القرص بسبب صغر حجم ذاكرة التخزين المؤقت.
<!-- 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>