إعداد النواة

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

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

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

لمعرفة تفاصيل حول الضوابط التي تم اتخاذها لتقوية النواة على الأجهزة، راجِع النظام أمان النواة (kernel). للحصول على تفاصيل حول الإعدادات المطلوبة، يمكنك الاطّلاع على مستند تعريف التوافق مع 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. ولا يمكن لهذه التبعيات وأعبر عنه في ملفات تجزئة تهيئة النواة (الموضحة أعلاه) لأن لا يدعم تنسيق هذه الملفات التعبيرات المنطقية. في 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 في الإصدار 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 (llkd)، وهي مُصمَّمة لاكتشاف حالات التعطُّل في النواة والحدّ منها. للحصول على تفاصيل عن استخدام "llkd"، يمكنك الرجوع إلى البرنامج الخفي لقفل Android Live-lock

vDSO32 على ARM64

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

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

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

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