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:

  • android-base Optionen aktivieren Android-Kernfunktionen und sollten wie von allen Geräten angegeben konfiguriert werden.
  • android-base- ARCH Optionen aktivieren Android-Kernfunktionen 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 aktivieren erweiterte Android-Funktionen und sind für Geräte optional.

Diese Konfigurationsdateien befinden sich im kernel/configs Repo. Verwenden Sie den Satz von Konfigurationsdateien, der der von Ihnen verwendeten Version des Kernels entspricht.

Einzelheiten zu Kontrollen, die bereits durchgeführt wurden, um den Kernel auf Ihren Geräten zu stärken, finden Sie unter System- und Kernelsicherheit . Einzelheiten zu den erforderlichen Einstellungen finden Sie im Android Compatibility Definition Document (CDD) .

Kernelkonfiguration generieren

Verwenden Sie für Geräte mit einem minimalistischen defconfig -Format das Skript merge_config.sh im Kernel-Baum, 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 verwenden können, um eine neue defconfig -Datei zu speichern oder einen neuen Kernel mit aktivierten Android-Funktionen zu kompilieren.

Zusätzliche Kernel-Konfigurationsanforderungen

In einigen Fällen kann der Plattformbetreuer aus mehreren Kernelfunktionen auswählen, um eine Android-Abhängigkeit zu erfüllen. Solche Abhängigkeiten können nicht in den Kernel-Konfigurationsfragmentdateien (oben beschrieben) ausgedrückt werden, weil das Format für diese 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
  • Kernel 4.4 und 4.9 haben CONFIG_ANDROID_LOW_MEMORY_KILLER=y ODER haben sowohl CONFIG_MEMCG=y als 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 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 Sandboxen ermöglicht, die den Kontext definieren, in dem ein Prozess Systemaufrufe durchführen kann. Die Thread-Synchronisationsfunktion (TSYNC) ermöglicht die Verwendung von Seccomp BPF aus Multithread-Programmen. Diese Fähigkeit ist auf Architekturen beschränkt, die Seccomp-Upstream-Unterstützung haben (ARM, ARM64, x86 und x86_64).

Android Live-Lock-Daemon

Android 10 enthält den Android Live-Lock Daemon ( llkd ), der entwickelt wurde, um Kernel-Deadlocks abzufangen und abzumildern. 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 Zykluskosten reduzieren können. Android 10 fügt Unterstützung für vDSO32 auf 64-Bit-Kernel hinzu (Android unterstützt bereits vDSO64 auf 64-Bit-Kernel und vDSO32 auf 32-Bit-Kernel). Die Verwendung von vDSO32 ( CONFIG_VDSO_COMPAT ) auf der ARM64-Architektur bietet eine 0,4-prozentige Verlängerung der Akkulaufzeit und andere 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 Compiler-Triplet arm32 aktivieren. Das Android-Kernel-Team hat ältere Versionen der vDSO-Patch-Reihe 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 CONFIG_CROSS_COMPILE_ARM32 ).

Niedrige RAM-Konfiguration

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

Direkte Rückforderung findet statt, wenn ein Prozess oder der Kernel versucht, eine Speicherseite zuzuweisen (entweder direkt oder aufgrund eines Fehlers in 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, dass Festplatten-I/O eine schmutzige, dateigestützte Seite löscht oder darauf wartet, 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 Rückforderung im Hintergrund auslösen. Dies ist ein Thread, der versucht, Seiten freizugeben, damit er bei der nächsten Zuweisung durch einen echten Thread schnell erfolgreich sein kann.

Der Standardschwellenwert zum Auslösen der Hintergrundwiederherstellung ist ziemlich niedrig, etwa 2 MB auf einem 2-GB-Gerät und 636 KB auf einem 512-MB-Gerät. Der Kernel fordert nur wenige Megabyte Speicher im Hintergrund zurück. Dies bedeutet, dass jeder Prozess, der schnell mehr als ein paar Megabyte zuweist, schnell auf die direkte Rückforderung stoßen wird.

Unterstützung für ein Kernel-Tunable wird im Android-3.4-Kernel-Zweig als Patch 92189d47f66c67e5fd92eafaa287e153197a454f ("add extra free kbytes tunable") hinzugefügt. Durch die Rosinenpickerei dieses Patches für den Kernel eines Geräts kann ActivityManager den Kernel anweisen, zu versuchen, drei Vollbild-32-bpp-Pufferspeicher frei zu halten.

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>

Tune LowMemoryKiller

ActivityManager konfiguriert die Schwellenwerte von LowMemoryKiller so, dass sie seiner Erwartung des Arbeitssatzes von dateigestützten Seiten (zwischengespeicherten Seiten) entsprechen, die zum Ausführen der Prozesse in jedem Bucket der Prioritätsstufe erforderlich sind. Wenn ein Gerät hohe Anforderungen an den Arbeitssatz stellt, z. B. 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 beendet werden, lange bevor es aufgrund eines zu kleinen Cache zu einem Festplatten-Thrash kommen würde.

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