Kernel-Konfiguration

Verwenden Sie die folgenden Konfigurationseinstellungen als Grundlage für eine Android-Kernelkonfiguration. Die Einstellungen sind in .cfg-Dateien für android-base, android-base-ARCH und android-recommended organisiert:

  • Mit android-base-Optionen können wichtige Android-Funktionen aktiviert werden. Sie sollten für alle Geräte wie angegeben konfiguriert werden.
  • Mit android-base-ARCH-Optionen werden grundlegende Android-Funktionen aktiviert und sollten für alle Geräte der Architektur ARCH wie angegeben konfiguriert werden. Nicht für alle Architekturen gibt es eine entsprechende Datei mit den erforderlichen Architekturoptionen. Wenn Ihre Architektur keine Datei enthält, gibt es keine zusätzlichen architekturspezifischen Kernel-Konfigurationsanforderungen für Android.
  • android-recommended. Diese Optionen aktivieren erweiterte Android-Funktionen und sind für Geräte optional.

Diese Konfigurationsdateien befinden sich im Repository kernel/configs. Verwenden Sie die Konfigurationsdateien, die der Version des verwendeten Kernels entsprechen.

Weitere Informationen zu den bereits ergriffenen Maßnahmen zur Stärkung des Kernels auf Ihren Geräten finden Sie unter System- und Kernelsicherheit. Weitere Informationen zu den erforderlichen Einstellungen finden Sie im Android Compatibility Definition Document (CDD).

Kernelkonfiguration generieren

Bei Geräten mit einem minimalistischen defconfig-Format können Sie Optionen mit dem merge_config.sh-Script im Kernel-Baum aktivieren:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

Dadurch wird eine .config-Datei generiert, mit der Sie eine neue defconfig-Datei speichern oder einen neuen Kernel mit aktivierten Android-Funktionen kompilieren können.

Zusätzliche Anforderungen an die Kernelkonfiguration

In einigen Fällen kann der Plattformadministrator aus mehreren Kernel-Features auswählen, um eine Android-Abhängigkeit zu erfüllen. Solche Abhängigkeiten können nicht in den oben beschriebenen Kernel-Konfigurationsfragmentdateien ausgedrückt werden, da das Format dieser Dateien keine logischen Ausdrücke unterstützt. Unter Android 9 und höher wird mit der Compatibility Test Suite (CTS) und der Vendor Test Suite (VTS) geprüft, ob die folgenden Anforderungen erfüllt sind:

  • CONFIG_OF=y oder CONFIG_ACPI=y
  • Die Kernel 4.4 und 4.9 haben CONFIG_ANDROID_LOW_MEMORY_KILLER=y ODER sowohl CONFIG_MEMCG=y als auch CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y oder CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y oder CONFIG_STRICT_MODULE_RWX=y
  • Nur für ARM64: CONFIG_ARM64_SW_TTBR0_PAN=y oder CONFIG_ARM64_PAN=y

Außerdem muss die Option CONFIG_INET_UDP_DIAG für 4.9-Kernel in Android 9 und höher auf y festgelegt sein.

Optionen für den USB-Hostmodus aktivieren

Aktivieren Sie für den USB-Hostmodus die folgenden Optionen:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

Aktivieren Sie für den USB-Hostmodus MIDI die folgende Option:

CONFIG_SND_USB_MIDI=y

Seccomp BPF mit TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) ist eine Kernel-Sicherheitstechnologie, die das Erstellen von Sandboxes ermöglicht, die den Kontext definieren, in dem ein Prozess Systemaufrufe ausführen kann. Die Funktion zur Threadsynchronisierung (TSYNC) ermöglicht die Verwendung von Seccomp BPF in mehrstufigen Programmen. Diese Möglichkeit ist auf Architekturen beschränkt, die Seccomp-Upstreams unterstützen (ARM, ARM64, x86 und x86_64).

Android-Live-Sperre-Daemon

Android 10 enthält den Android-Live-Lock-Daemon (llkd), der Kernel-Deadlocks erkennen und beheben soll. Weitere Informationen zur Verwendung von llkd finden Sie unter Android Live-Lock-Daemon.

vDSO32 auf ARM64

Ein vDSO (Virtual Dynamic Shared Object) ist eine Alternative zu Systemaufrufen, die bei richtiger Verwendung und Konfiguration die Zykluskosten senken kann. Android 10 unterstützt vDSO32 auf 64-Bit-Kerneln. Android unterstützt bereits vDSO64 auf 64-Bit-Kerneln und vDSO32 auf 32-Bit-Kerneln. Die Verwendung von vDSO32 (CONFIG_VDSO_COMPAT) auf ARM64-Architektur erhöht die Akkulaufzeit um 0,4 % und bietet weitere Leistungsverbesserungen.

Die Linux-Community arbeitet aktiv daran, vDSOs über Architekturen hinweg zu vereinheitlichen. Sie können vDSO in Ihrem Linux-Kernel einrichten, indem Sie vDSO32 mit CONFIG_COMPAT und CONFIG_CROSS_COMPILE_COMPAT_VDSO mit dem arm32-Compiler-Triplett aktivieren. Das Android-Kernel-Team hat ältere Versionen der vDSO-Patchreihe auf Pixel-Geräte zurückportiert. Beispiele finden Sie in Pixel-Kernel-Builds (LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN-Pfad, CROSS_COMPILE_ARM32-Referenz und CONFIG_CROSS_COMPILE_ARM32-Konfiguration).

Konfiguration mit wenig RAM

Kernel und ActivityManager optimieren, um die direkte Rückforderung zu reduzieren

Die direkte Rückforderung tritt auf, wenn ein Prozess oder der Kernel versucht, eine Arbeitsspeicherseite zuzuweisen (entweder direkt oder aufgrund eines Fehlers auf einer neuen Seite) und der Kernel den gesamten verfügbaren freien Arbeitsspeicher belegt hat. Dazu muss der Kernel die Zuweisung blockieren, während er eine Seite freigibt. Dies erfordert wiederum häufig die Auslagerung einer schmutzigen Seite, die von einer Datei unterstützt wird, oder das Warten, bis lowmemorykiller einen Prozess beendet. Dies kann zu zusätzlichen E/A-Vorgängen in jedem Thread führen, einschließlich eines UI-Threads.

Um eine direkte Rückforderung zu vermeiden, verfügt der Kernel über Wasserzeichen, die kswapd oder die Rückforderung im Hintergrund auslösen. Dieser Thread versucht, Seiten freizugeben, damit die nächste Zuweisung durch einen echten Thread schnell erfolgen kann.

Der Standardgrenzwert für die Rückforderung des Hintergrunds ist relativ niedrig: etwa 2 MB auf einem Gerät mit 2 GB und 636 KB auf einem Gerät mit 512 MB. Der Kernel gibt beim Zurückfordern im Hintergrund nur wenige Megabyte Arbeitsspeicher frei. Das bedeutet, dass jeder Prozess, der schnell mehr als ein paar Megabyte zuweist, schnell die direkte Rückforderung erreicht.

Im Android-3.4-Kernel-Branch wurde die Unterstützung für eine konfigurierbare Kernel-Funktion als Patch 92189d47f66c67e5fd92eafaa287e153197a454f („add extra free kbytes tunable“) hinzugefügt. Wenn dieser Patch in den Kernel eines Geräts aufgenommen wird, kann ActivityManager dem Kernel mitteilen, dass er versuchen soll, drei Vollbild-32-bpp-Speicher-Buffer freizuhalten.

Diese Schwellenwerte können mit dem config.xml-Framework konfiguriert werden.

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

ActivityManager konfiguriert die Grenzwerte der LowMemoryKiller so, dass sie den erwarteten Arbeitssatz von Datei-Backed-Seiten (im Cache gespeicherte Seiten) entsprechen, der zum Ausführen der Prozesse in jedem Bucket der Prioritätsebene erforderlich ist. Wenn ein Gerät hohe Anforderungen an den Arbeitssatz stellt, z. B. wenn die Benutzeroberfläche des Anbieters mehr Arbeitsspeicher benötigt oder weitere Dienste hinzugefügt wurden, können die Grenzwerte erhöht werden.

Die Grenzwerte können reduziert werden, wenn zu viel Arbeitsspeicher für Datei-Backed-Seiten reserviert wird. Hintergrundprozesse werden dann beendet, lange bevor es zu einem Datenträger-Trashing kommt, weil der Cache zu klein wird.

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