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
oderCONFIG_ACPI=y
- Kernel 4.4 und 4.9 haben
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
ODER haben sowohlCONFIG_MEMCG=y
alsCONFIG_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
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>