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
oderCONFIG_ACPI=y
- 4.4- und 4.9-Kernel haben
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
ODER haben 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
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 ziemlich niedrig, 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 seiner Erwartung 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>