Utilizza le seguenti impostazioni di configurazione come base per una configurazione del kernel Android. Le impostazioni sono organizzate in file .cfg
per android-base
,
android-base-ARCH
e
android-recommended
:
- Le opzioni
android-base
attivano le funzionalità di base di Android e devono essere configurate come specificato da tutti i dispositivi. - Le opzioni
android-base-ARCH
attivano le funzionalità di base di Android e devono essere configurate come specificato da tutti i dispositivi dell'architettura ARCH. Non tutte le architetture hanno un file corrispondente di opzioni richieste specifiche per l'architettura. Se la tua architettura non ha un file, non ha requisiti aggiuntivi di configurazione del kernel specifici per l'architettura per Android. android-recommended
. Queste opzioni attivano le funzionalità avanzate di Android e sono facoltative per i dispositivi.
Questi file di configurazione si trovano nel
kernel/configs
repository. Utilizza il set di file di configurazione che corrisponde alla versione del kernel in uso.
Per informazioni dettagliate sui controlli già intrapresi per rafforzare il kernel sui tuoi dispositivi, vedi Sicurezza del sistema e del kernel. Per informazioni dettagliate sulle impostazioni richieste, consulta il Compatibility Definition Document (CDD) di Android.
Genera configurazione del kernel
Per i dispositivi con un formato defconfig
minimalista, utilizza lo script merge_config.sh
nell'albero del kernel per attivare le opzioni:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
Viene generato un file .config
che puoi utilizzare per salvare un nuovo
file .config
o compilare un nuovo kernel con le funzionalità Android attivate.
Requisiti aggiuntivi per la configurazione del kernel
In alcuni casi, il gestore della piattaforma può scegliere tra più funzionalità del kernel per soddisfare una dipendenza Android. Queste dipendenze non possono essere espresse nei file del frammento di configurazione del kernel (descritti sopra) perché il formato di questi file non supporta le espressioni logiche. In Android 9 e versioni successive, la Compatibility Test Suite (CTS) e la Vendor Test Suite (VTS) verificano che i seguenti requisiti siano soddisfatti:
CONFIG_OF=y
oCONFIG_ACPI=y
- I kernel 4.4 e 4.9 hanno
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
OPPURE hanno siaCONFIG_MEMCG=y
cheCONFIG_MEMCG_SWAP=y
CONFIG_DEBUG_RODATA=y
oCONFIG_STRICT_KERNEL_RWX=y
CONFIG_DEBUG_SET_MODULE_RONX=y
oppureCONFIG_STRICT_MODULE_RWX=y
- Solo per ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
oCONFIG_ARM64_PAN=y
Inoltre, l'opzione CONFIG_INET_UDP_DIAG
deve essere impostata su
y
per i kernel 4.9 in Android 9 e versioni successive.
Attivare le opzioni della modalità host USB
Per l'audio in modalità host USB, abilita le seguenti opzioni:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
Per il MIDI in modalità host USB, attiva la seguente opzione:
CONFIG_SND_USB_MIDI=y
Seccomp BPF con TSYNC
Secure Computing Berkeley Packet Filter (Seccomp BPF) è una tecnologia di sicurezza del kernel che consente la creazione di sandbox che definiscono il contesto in cui un processo può effettuare chiamate di sistema. La funzionalità di sincronizzazione dei thread (TSYNC) consente di utilizzare Seccomp BPF da programmi multithread. Questa capacità è limitata alle architetture che supportano Seccomp in upstream (ARM, ARM64, x86 e x86_64).
Daemon live-lock di Android
Android 10 include il demone live-lock di Android
(llkd
), progettato per rilevare e attenuare i deadlock del kernel.
Per informazioni dettagliate sull'utilizzo di llkd
, consulta
Daemon live-lock di Android.
vDSO32 su ARM64
L'oggetto condiviso dinamico virtuale (vDSO) è un'alternativa alle chiamate di sistema che, se utilizzata e configurata correttamente, può ridurre i costi del ciclo. Android 10 aggiunge il supporto per vDSO32 sui kernel a 64 bit (Android supporta già vDSO64 sui kernel a 64 bit e vDSO32 sui kernel a 32 bit). L'utilizzo di vDSO32 (CONFIG_VDSO_COMPAT
) sull'architettura ARM64 offre un aumento dello 0,4% della durata della batteria e altri miglioramenti delle prestazioni.
La community di Linux sta lavorando attivamente per unificare i vDSO su più architetture. Puoi configurare vDSO nel kernel di Linux attivando vDSO32 con CONFIG_COMPAT
e CONFIG_CROSS_COMPILE_COMPAT_VDSO
con la tripletta del compilatore arm32.
Il team del kernel di Android ha eseguito il backporting delle versioni precedenti della serie di patch vDSO
nei dispositivi Pixel, quindi puoi trovare esempi nelle build del kernel di Pixel
(LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
path,
CROSS_COMPILE_ARM32
reference e
CONFIG_CROSS_COMPILE_ARM32
config).
Configurazione con RAM insufficiente
Ottimizza il kernel e ActivityManager per ridurre il recupero diretto
Il recupero diretto si verifica quando un processo o il kernel tenta di allocare una pagina di memoria (direttamente o a causa di un errore in una nuova pagina) e il kernel ha utilizzato tutta la memoria libera disponibile. Ciò richiede che il kernel blocchi l'allocazione mentre libera una pagina. Ciò a sua volta richiede spesso l'I/O del disco per svuotare una pagina con dati non validi basata su file o attendere che lowmemorykiller
interrompa un processo. Ciò può comportare un'I/O aggiuntiva in qualsiasi thread, incluso un thread dell'interfaccia utente.
Per evitare il recupero diretto, il kernel contiene filigrane che attivano
kswapd
o il recupero in background. Si tratta di un thread che tenta di liberare pagine in modo che la prossima volta che viene allocato un thread reale, l'operazione possa essere completata rapidamente.
La soglia predefinita per attivare il recupero in background è piuttosto bassa, circa 2 MB su un dispositivo da 2 GB e 636 KB su un dispositivo da 512 MB. Il kernel recupera solo pochi megabyte di memoria in background. Ciò significa che qualsiasi processo che alloca rapidamente più di qualche megabyte attiverà rapidamente il recupero diretto.
Il supporto per un parametro di configurazione del kernel è stato aggiunto al ramo del kernel Android-3.4 come patch 92189d47f66c67e5fd92eafaa287e153197a454f ("add extra free kbytes
tunable"). L'applicazione selettiva di questa patch al kernel di un dispositivo consente
ActivityManager
di indicare al kernel di provare a mantenere liberi tre buffer di memoria
a 32 bpp a schermo intero.
Queste soglie possono essere configurate con il
framework config.xml
.
<!-- 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>
Modificare LowMemoryKiller
ActivityManager
configura le soglie di LowMemoryKiller
in modo che corrispondano alle sue aspettative relative al set di lavoro di pagine basate su file (pagine memorizzate nella cache) necessarie per eseguire i processi in ogni bucket con livello di priorità. Se un dispositivo ha requisiti elevati per il set di lavoro, ad esempio se l'interfaccia utente del fornitore richiede più memoria o se sono stati aggiunti altri servizi, le soglie possono essere aumentate.
Le soglie possono essere ridotte se viene riservata troppa memoria per le pagine basate su file, in modo che i processi in background vengano interrotti molto prima che si verifichi il thrashing del disco a causa della riduzione eccessiva della cache.
<!-- 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>