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
oderCONFIG_ACPI=y
- Die Kernel 4.4 und 4.9 haben
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
ODER sowohlCONFIG_MEMCG=y
als auchCONFIG_MEMCG_SWAP=y
CONFIG_DEBUG_RODATA=y
oderCONFIG_STRICT_KERNEL_RWX=y
CONFIG_DEBUG_SET_MODULE_RONX=y
oderCONFIG_STRICT_MODULE_RWX=y
- Nur für ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
oderCONFIG_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>