Kernel-Konfiguration

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

  • android-base Optionen ermöglichen die Kernfunktionen von Android und sollten wie von allen Geräten angegeben konfiguriert werden.
  • android-base- ARCH Optionen ermöglichen Kernfunktionen von Android und sollten wie von allen Geräten der Architektur ARCH angegeben konfiguriert werden. Nicht alle Architekturen verfügen über eine entsprechende Datei mit architekturspezifischen erforderlichen Optionen. Wenn Ihre Architektur keine Datei hat, gibt es keine zusätzlichen architekturspezifischen Kernel-Konfigurationsanforderungen für Android.
  • android-recommended . Diese Optionen ermöglichen erweiterte Android-Funktionen und sind für Geräte optional.

Diese Konfigurationsdateien befinden sich im kernel/configs Repository. Verwenden Sie die Konfigurationsdateien, die der von Ihnen verwendeten Kernelversion entsprechen.

Einzelheiten zu den bereits durchgeführten Kontrollen zur Stärkung des Kernels auf Ihren Geräten finden Sie unter System- und Kernelsicherheit . Einzelheiten zu den erforderlichen Einstellungen finden Sie im Android Compatibility Definition Document (CDD) .

Kernel-Konfiguration generieren

Für Geräte mit einem minimalistischen defconfig Format verwenden Sie das Skript merge_config.sh im Kernelbaum, um Optionen zu 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, die Sie zum Speichern einer neuen defconfig Datei oder zum Kompilieren eines neuen Kernels mit aktivierten Android-Funktionen verwenden können.

Zusätzliche Anforderungen an die Kernel-Konfiguration

In manchen Fällen kann der Plattformbetreuer aus mehreren Kernelfunktionen wählen, um eine Android-Abhängigkeit zu erfüllen. Solche Abhängigkeiten können nicht in den Kernel-Konfigurationsfragmentdateien (oben beschrieben) ausgedrückt werden, da das Format dieser Dateien keine logischen Ausdrücke unterstützt. In Android 9 und höher überprüfen Compatibility Test Suite (CTS) und Vendor Test Suite (VTS) , ob die folgenden Anforderungen erfüllt sind:

  • CONFIG_OF=y oder CONFIG_ACPI=y
  • 4.4- und 4.9-Kernel haben CONFIG_ANDROID_LOW_MEMORY_KILLER=y ODER haben 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

Darüber hinaus muss die Option CONFIG_INET_UDP_DIAG für 4.9-Kernel in Android 9 und höher auf y gesetzt werden.

Aktivieren Sie die Optionen für den USB-Hostmodus

Aktivieren Sie für Audio im 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-Host-Modus 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 die Erstellung von Sandboxes ermöglicht, die den Kontext definieren, in dem ein Prozess Systemaufrufe durchführen darf. Die Thread-Synchronisationsfunktion (TSYNC) ermöglicht die Verwendung von Seccomp BPF aus Multithread-Programmen. Diese Funktion ist auf Architekturen beschränkt, die Upstream-Unterstützung für Seccomp bieten (ARM, ARM64, x86 und x86_64).

Android Live-Lock-Daemon

Android 10 enthält den Android Live-Lock Daemon ( llkd ), der Kernel-Deadlocks abfangen und entschärfen soll. Einzelheiten zur Verwendung von llkd finden Sie unter Android Live-Lock Daemon .

vDSO32 auf ARM64

Virtual Dynamic Shared Object (vDSO) ist eine Alternative zu Systemaufrufen, die bei korrekter Verwendung und Konfiguration die Zykluskosten senken kann. Android 10 fügt Unterstützung für vDSO32 auf 64-Bit-Kerneln hinzu (Android unterstützt bereits vDSO64 auf 64-Bit-Kerneln und vDSO32 auf 32-Bit-Kerneln). Die Verwendung von vDSO32 ( CONFIG_VDSO_COMPAT ) auf der ARM64-Architektur führt zu einer Verlängerung der Akkulaufzeit um 0,4 Prozent und anderen Leistungsverbesserungen.

Die Linux-Community arbeitet aktiv an der Vereinheitlichung von vDSOs über Architekturen hinweg . 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-Patchserie auf Pixel-Geräte zurückportiert, sodass Sie Beispiele in Pixel-Kernel-Builds finden können (Pfad LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN , Referenz CROSS_COMPILE_ARM32 und Konfiguration CONFIG_CROSS_COMPILE_ARM32 ).

Geringe RAM-Konfiguration

Optimieren Sie Kernel/ActivityManager, um die direkte Rückforderung zu reduzieren

Eine direkte Rückforderung erfolgt, wenn ein Prozess oder der Kernel versucht, eine Speicherseite zuzuweisen (entweder direkt oder aufgrund eines Fehlers auf einer neuen Seite) und der Kernel den gesamten verfügbaren freien Speicher verwendet hat. Dies erfordert, dass der Kernel die Zuweisung blockiert, während er eine Seite freigibt. Dies wiederum erfordert oft Festplatten-I/O, um eine schmutzige, dateigestützte Seite zu löschen oder darauf zu warten, dass lowmemorykiller einen Prozess stoppt. 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 eine Hintergrundrückforderung auslösen. Dabei handelt es sich um einen Thread, der versucht, Seiten freizugeben, damit er beim nächsten Zuweisen eines echten Threads schnell erfolgreich sein kann.

Der Standardschwellenwert zum Auslösen der Hintergrundwiederherstellung ist relativ niedrig und liegt bei etwa 2 MB auf einem 2-GB-Gerät und 636 KB auf einem 512-MB-Gerät. Bei der Hintergrundrückgewinnung fordert der Kernel nur wenige Megabyte Speicher zurück. Das bedeutet, dass jeder Prozess, der schnell mehr als ein paar Megabyte zuweist, schnell auf eine direkte Rückforderung stößt.

Unterstützung für eine Kernel-Optimierung wird im Android-3.4-Kernelzweig als Patch 92189d47f66c67e5fd92eafaa287e153197a454f („Add extra free kbytes tunable“) hinzugefügt. Wenn Sie diesen Patch für den Kernel eines Geräts auswählen, kann ActivityManager den Kernel anweisen, zu versuchen, drei Vollbild-32-bpp-Speicherpuffer 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 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>

Stellen Sie LowMemoryKiller ein

ActivityManager konfiguriert die Schwellenwerte des LowMemoryKiller so, dass sie seinen Erwartungen an den Arbeitssatz dateigestützter Seiten (zwischengespeicherter Seiten) entsprechen, der zum Ausführen der Prozesse in jedem Prioritätsstufen-Bucket erforderlich ist. Wenn ein Gerät hohe Anforderungen an den Arbeitssatz stellt, beispielsweise wenn die Benutzeroberfläche des Anbieters mehr Speicher benötigt oder wenn mehr Dienste hinzugefügt wurden, können die Schwellenwerte erhöht werden.

Die Schwellenwerte können reduziert werden, wenn zu viel Speicher für dateigestützte Seiten reserviert wird, sodass Hintergrundprozesse lange vor dem Festplatten-Thrashing beendet werden, weil der Cache zu klein wird.

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