Usa la siguiente configuración como base para una configuración del kernel de Android. La configuración se organiza en archivos .cfg
para android-base
, android-base-ARCH
y android-recommended
:
- Las opciones
android-base
habilitan las funciones principales de Android y deben configurarse como lo especifican todos los dispositivos. - Las opciones de
android-base-ARCH
habilitan las funciones principales de Android y deben configurarse como lo especifican todos los dispositivos de la arquitectura ARCH. No todas las arquitecturas tienen un archivo correspondiente de opciones requeridas específicas de la arquitectura. Si tu arquitectura no tiene un archivo, no tiene requisitos adicionales de configuración del kernel específicos de la arquitectura para Android. android-recommended
. Estas opciones habilitan funciones avanzadas de Android y son opcionales para los dispositivos.
Estos archivos de configuración se encuentran en el repositorio kernel/configs
. Usa el conjunto de archivos de configuración que corresponde a la versión del kernel que usas.
Para obtener detalles sobre los controles que ya se implementaron para fortalecer el kernel en tus dispositivos, consulta Seguridad del sistema y del kernel. Para obtener detalles sobre la configuración requerida, consulta el Documento de definición de compatibilidad de Android (CDD).
Genera la configuración del kernel
Para dispositivos que tienen un formato defconfig
minimalista, usa la secuencia de comandos merge_config.sh
en el árbol del kernel para habilitar las siguientes opciones:
ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg
Esto genera un archivo .config
que puedes usar para guardar un archivo defconfig
nuevo o compilar un kernel nuevo con las funciones de Android habilitadas.
Requisitos adicionales de configuración del kernel
En algunos casos, el encargado de mantenimiento de la plataforma puede elegir entre varias funciones de kernel para satisfacer una dependencia de Android. Esas dependencias no se pueden expresar en los archivos de fragmentos de configuración del kernel (descritos anteriormente) porque el formato de esos archivos no admite expresiones lógicas. En Android 9 y versiones posteriores, el Conjunto de pruebas de compatibilidad (CTS) y el Conjunto de pruebas del proveedor (VTS) verifican que se cumplan los siguientes requisitos:
CONFIG_OF=y
oCONFIG_ACPI=y
- Los kernels 4.4 y 4.9 tienen
CONFIG_ANDROID_LOW_MEMORY_KILLER=y
O tienenCONFIG_MEMCG=y
yCONFIG_MEMCG_SWAP=y
. CONFIG_DEBUG_RODATA=y
oCONFIG_STRICT_KERNEL_RWX=y
CONFIG_DEBUG_SET_MODULE_RONX=y
oCONFIG_STRICT_MODULE_RWX=y
- Solo para ARM64:
CONFIG_ARM64_SW_TTBR0_PAN=y
oCONFIG_ARM64_PAN=y
Además, la opción CONFIG_INET_UDP_DIAG
debe establecerse como y
para los kernels 4.9 en Android 9 y versiones posteriores.
Habilita las opciones del modo host USB
Para el audio en modo host USB, habilita las siguientes opciones:
CONFIG_SND_USB=y CONFIG_SND_USB_AUDIO=y # CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver
Para MIDI en modo host USB, habilita la siguiente opción:
CONFIG_SND_USB_MIDI=y
Seccomp BPF con TSYNC
El filtro de paquetes Berkeley de Secure Computing (Seccomp BPF) es una tecnología de seguridad del kernel que permite la creación de zonas de pruebas que definen el contexto en el que un proceso puede realizar llamadas al sistema. La función de sincronización de subprocesos (TSYNC) habilita el uso de Seccomp BPF desde programas con varios subprocesos. Esta función se limita a las arquitecturas que tienen compatibilidad con Seccomp upstream (ARM, ARM64, x86 y x86_64).
Daemon de bloqueo activo de Android
Android 10 incluye el daemon de bloqueo activo de Android (llkd
), que está diseñado para detectar y mitigar los interbloqueos del kernel.
Para obtener más información sobre el uso de llkd
, consulta el daemon de bloqueo activo de Android.
vDSO32 en ARM64
El objeto compartido dinámico virtual (vDSO) es una alternativa a las llamadas al sistema que, cuando se usa y configura correctamente, puede reducir los costos del ciclo. En Android 10, se agrega compatibilidad con vDSO32 en kernels de 64 bits (Android ya admite vDSO64 en kernels de 64 bits y vDSO32 en kernels de 32 bits). El uso de vDSO32 (CONFIG_VDSO_COMPAT
) en la arquitectura ARM64 proporciona un aumento del 0.4% en la duración de la batería y otras mejoras de rendimiento.
La comunidad de Linux está trabajando activamente en la unificación de vDSO en todas las arquitecturas. Para configurar vDSO en tu kernel de Linux, habilita vDSO32 con CONFIG_COMPAT
y CONFIG_CROSS_COMPILE_COMPAT_VDSO
con el triplete del compilador arm32.
El equipo del kernel de Android portó versiones anteriores de la serie de parches de vDSO a dispositivos Pixel, por lo que puedes encontrar ejemplos en compilaciones de kernel de Pixel (ruta de acceso LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN
, referencia CROSS_COMPILE_ARM32
y configuración CONFIG_CROSS_COMPILE_ARM32
).
Configuración de RAM baja
Ajusta el kernel y ActivityManager para reducir la recuperación directa.
La recuperación directa se produce cuando un proceso o el kernel intenta asignar una página de memoria (directamente o debido a un error en una página nueva) y el kernel usó toda la memoria libre disponible. Esto requiere que el kernel bloquee la asignación mientras se libera una página. Esto, a su vez, suele requerir E/S de disco para borrar una página con copia de seguridad de archivo no sincronizada o esperar a que lowmemorykiller
detenga un proceso. Esto puede generar E/S adicionales en cualquier subproceso, incluido un subproceso de IU.
Para evitar la recuperación directa, el kernel tiene marcas de agua que activan kswapd
o la recuperación en segundo plano. Este es un subproceso que intenta liberar páginas para que la próxima vez que se asigne un subproceso real, pueda completarse con rapidez.
El umbral predeterminado para activar la recuperación en segundo plano es bastante bajo, alrededor de 2 MB en un dispositivo de 2 GB y 636 KB en un dispositivo de 512 MB. El kernel recupera solo unos pocos megabytes de memoria en la recuperación en segundo plano. Esto significa que cualquier proceso que asigne más de unos pocos megabytes va a obtener rápidamente un reclamo directo.
Se agregó compatibilidad con un kernel ajustable en la rama del kernel de Android-3.4 como el parche 92189d47f66c67e5fd92eafaa287e153197a454f ("agregar kbytes libres adicionales ajustables"). El uso selectivo de este parche en el kernel de un dispositivo permite que ActivityManager
le diga al kernel que intente mantener libres tres búferes de memoria de 32 bpp de pantalla completa.
Estos umbrales se pueden configurar con el 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>
Ajusta LowMemoryKiller
ActivityManager
configura los umbrales de LowMemoryKiller
para que coincidan con su expectativa del conjunto de trabajo de páginas respaldadas por archivos (páginas almacenadas en caché) necesarias para ejecutar los procesos en cada bucket de nivel de prioridad. Si un dispositivo tiene requisitos altos para el conjunto de trabajo (por ejemplo, si la IU del proveedor requiere más memoria o si se agregaron más servicios), se pueden aumentar los umbrales.
Los umbrales se pueden reducir si se reserva demasiada memoria para las páginas respaldadas por archivos, de modo que los procesos en segundo plano se cancelen mucho antes de que se produzca el intercambio de disco debido a que la caché se vuelve demasiado pequeña.
<!-- 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>