إعداد النواة

استخدِم إعدادات الضبط التالية كأساس لإعداد نواة Android. يتم تنظيم الإعدادات في ملفات .cfg لكل من android-base وandroid-base-ARCH وandroid-recommended:

  • تعمل خيارات android-base على تفعيل ميزات Android الأساسية، ويجب ضبطها على النحو المحدّد من خلال جميع الأجهزة.
  • تفعِّل خيارات android-base-ARCH ميزات Android الأساسية ويجب ضبطها على النحو المحدَّد من قِبل جميع الأجهزة التي تعمل بالبنية ARCH. لا تتضمّن بعض التصاميم المعمارية ملفًا مقابلًا للخيارات المطلوبة الخاصة بالتصميم. إذا لم تتضمّن البنية ملفًا، يعني ذلك أنّها لا تتضمن متطلبات إضافية لإعدادات kernel الخاصة بالبنية على Android.
  • android-recommended. تفعِّل هذه الخيارات ميزات Android المتقدّمة وهي اختيارية للأجهزة.

تتوفّر ملفات الإعداد هذه في مستودع kernel/configs. استخدِم مجموعة ملفات الإعداد التي تتوافق مع إصدار النواة الذي تستخدمه.

للحصول على تفاصيل حول عناصر التحكّم التي تم اتّخاذها لتعزيز النواة على أجهزتك، يمكنك الاطّلاع على مقالة أمان النظام والنواة. للاطّلاع على تفاصيل عن الإعدادات المطلوبة، يُرجى الاطّلاع على مستند تعريف التوافق مع 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 مفعَّلة.

متطلبات إضافية لتهيئة النواة

في بعض الحالات، يمكن لمشرف النظام الأساسي الاختيار من بين ميزات متعدّدة للقشرة لتلبية شرط الاعتماد على Android. لا يمكن التعبير عن هذه التبعيات في ملفات أجزاء إعدادات النواة (الموضّحة أعلاه) لأنّ تنسيق هذه الملفات لا يتيح استخدام التعبيرات المنطقية. في الإصدار 9 من نظام Android والإصدارات الأحدث، يتحقّق مجموعة أدوات اختبار التوافق (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 في الإصدار 9 من Android والإصدارات الأحدث.

تفعيل خيارات وضع مضيف 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

يتضمّن نظام التشغيل Android 10 برنامج Android live-lock daemon (llkd)، وهو مصمّم لرصد حالات التوقف المفاجئ لنظام التشغيل والحدّ منها. لمعرفة تفاصيل عن استخدام llkd، يُرجى الرجوع إلى الخادم الدائم لقفل الشاشة في Android.

vDSO32 على ARM64

العنصر الافتراضي المشترَك الديناميكي (vDSO) هو بديل لطلبات النظام التي يمكن أن تقلِّل تكاليف الدورات عند استخدامها وضبطها بشكلٍ صحيح. يضيف نظام Android 10 ميزة استخدام vDSO32 مع نواة 64 بت (يتوافق نظام Android حاليًا مع vDSO64 مع نواة 64 بت وvDSO32 مع نواة 32 بت). ويؤدي استخدام vDSO32 (CONFIG_VDSO_COMPAT) على بنية ARM64 إلى زيادة عمر البطارية بنسبة 0.4 في المئة إلى جانب تحسينات أخرى في الأداء.

يعمل منتدى Linux بنشاط على توحيد وحدات vDSO على جميع الأنظمة الأساسية. يمكنك إعداد vDSO في نواة Linux من خلال تفعيل vDSO32 مع CONFIG_COMPAT وCONFIG_CROSS_COMPILE_COMPAT_VDSO باستخدام الإصدار الثلاثي من أداة التحويل البرمجي Arm32. نقل فريق نواة Android الإصدارات القديمة من سلسلة تصحيحات vDSO إلى أجهزة Pixel، لذا يمكنك العثور على أمثلة في إصدارات نواة Pixel (LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN المسار، CROSS_COMPILE_ARM32 المرجع، CONFIG_CROSS_COMPILE_ARM32 الإعداد).

إعدادات ذاكرة الوصول العشوائي (RAM) المنخفضة

ضبط kernel وActivityManager لتقليل عمليات الاسترداد المباشر

تحدث عملية الاسترداد المباشر عندما تحاول العملية أو النواة تخصيص صفحة من الذاكرة (إما بشكل مباشر أو بسبب خطأ في صفحة جديدة) وتستخدم النواة كل الذاكرة الخالية المتوفرة. وهو ما يتطلب من النواة حظر التخصيص بينما تُفرغ هذه الصفحة. ويتطلّب ذلك بدوره غالبًا عمليات إدخال/إخراج القرص لتفريغ ملف غير مسموح بوصوله إلى الذاكرة في صفحة أو الانتظار إلى أن يوقف lowmemorykiller عملية . ويمكن أن يؤدي ذلك إلى زيادة عمليات الإدخال/الإخراج في أي سلسلة محادثات، بما في ذلك سلسلة محادثات واجهة المستخدم.

لتجنب عملية الاسترداد المباشرة، تحتوي النواة على علامات مائية تؤدي إلى تشغيل kswapd أو استرداد الخلفية. هذا خيط يحاول إخلاء الصفحات حتى يتمكّن الخيط الحقيقي من تخصيصها في المرة القادمة بسرعة.

إنّ الحدّ الأدنى التلقائي لبدء عملية استرداد الذاكرة في الخلفية منخفض جدًا، ويتراوح بين حوالى 2 ميغابايت على جهاز بسعة 2 غيغابايت و636 كيلوبايت على جهاز بسعة 512 ميغابايت. لا تسترد النواة سوى بضعة ميغابايت من الذاكرة في عملية استرداد الخلفية. وهذا يعني أنّه سيصل أيّ عملية تُخصّص بسرعة أكثر من بضعة ميغابايت إلى مرحلة استرداد الذاكرة المباشرة بسرعة.

تمت إضافة الدعم لتوفُّر kernel في فرع نواة Android-3.4 كما يلي: patch 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 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 لمطابقة توقّعاته بشأن المجموعة العاملة من الصفحات المستندة إلى الملفات (الصفحات المخزّنة مؤقتًا) المطلوبة لتشغيل العمليات في كل مجموعة على مستوى الأولوية. إذا كان للجهاز متطلبات عالية لمجموعة العمل، على سبيل المثال إذا كانت واجهة مستخدم البائع تتطلب ذاكرة أكبر أو إضافة المزيد من الخدمات، يمكن أن تتم زيادة الحدود الدنيا.

يمكن تقليل الحدود الدنيا إذا كان يتم حجز قدر كبير جدًا من الذاكرة لتحميل الصفحات المستندة إلى الملفات، وذلك لإيقاف العمليات التي تعمل في الخلفية قبل وقت طويل من حدوث تداخل في القرص بسبب صغر ذاكرة التخزين المؤقت.

<!-- 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>