Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Configuración del kernel

Utilice los siguientes ajustes de configuración como base para una configuración del kernel de Android. Los ajustes se organizan en .cfg archivos para android-base , android-base- ARCH , y android-recommended :

  • android-base opciones permiten características de Android núcleo y deben configurarse como se especifica en todos los dispositivos.
  • android-base- ARCH opciones permiten características de Android núcleo y deben configurarse como se especifica en todos los dispositivos de la arquitectura ARCH . No todas las arquitecturas tienen un archivo correspondiente de opciones requeridas específicas de la arquitectura. Si su 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 kernel/configs de pases. Utilice el conjunto de archivos de configuración que corresponda a la versión del núcleo que está utilizando.

Para más detalles sobre los controles ya realizados para fortalecer el núcleo en sus dispositivos, consulte Sistema y seguridad del kernel . Para más detalles sobre los ajustes necesarios, consulte la definición de documento de compatibilidad de Android (CDD) .

Generar configuración del núcleo

Para los dispositivos que tienen un minimalista defconfig formato, utilice el merge_config.sh script en el árbol del kernel para permitir opciones:

ARCH=ARCH scripts/kconfig/merge_config.sh <...>/device_defconfig <...>/android-base.cfg <...>/android-base-ARCH.cfg <...>/android-recommended.cfg

Esto genera un .config archivo que se puede utilizar para guardar un nuevo defconfig archivo o compilar un nuevo núcleo con Android activadas.

Requisitos adicionales de configuración del kernel

En algunos casos, el mantenedor de la plataforma puede elegir entre varias funciones del núcleo para satisfacer una dependencia de Android. Estas 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 superior, prueba de compatibilidad Suite (CTS) y el proveedor de Prueba (VTS) verificar que se cumplen los siguientes requisitos:

  • CONFIG_OF=y o CONFIG_ACPI=y
  • 4.4 y 4.9 kernels tener CONFIG_ANDROID_LOW_MEMORY_KILLER=y OR tener tanto CONFIG_MEMCG=y y CONFIG_MEMCG_SWAP=y
  • CONFIG_DEBUG_RODATA=y o CONFIG_STRICT_KERNEL_RWX=y
  • CONFIG_DEBUG_SET_MODULE_RONX=y o CONFIG_STRICT_MODULE_RWX=y
  • Para ARM64 solamente: CONFIG_ARM64_SW_TTBR0_PAN=y o CONFIG_ARM64_PAN=y

Además, el CONFIG_INET_UDP_DIAG opción se debe establecer en y para 4.9 kernels en Android 9 y superior.

Habilitar las opciones del modo de host USB

Para el audio del modo host USB, habilite las siguientes opciones:

CONFIG_SND_USB=y
CONFIG_SND_USB_AUDIO=y
# CONFIG_USB_AUDIO is for a peripheral mode (gadget) driver

Para el modo de host USB MIDI, habilite la siguiente opción:

CONFIG_SND_USB_MIDI=y

Seccomp BPF con TSYNC

Secure Computing Berkeley Packet Filter (Seccomp BPF) es una tecnología de seguridad del núcleo que permite la creación de entornos limitados que definen el contexto en el que un proceso puede realizar llamadas al sistema. La función de sincronización de subprocesos (TSYNC) permite el uso de Seccomp BPF desde programas multiproceso. Esta capacidad está limitada a arquitecturas que tienen compatibilidad con Seccomp en sentido ascendente (ARM, ARM64, x86 y x86_64).

Demonio Live-Lock de Android

Android 10 incluye el Android Live-Lock Daemon ( llkd ), que está diseñado para la captura y mitigar kernel puntos muertos. Para más detalles sobre el uso del llkd , consulte Android Live-Lock Daemon .

vDSO32 en ARM64

El objeto virtual dinámico compartido (vDSO) es una alternativa a las llamadas al sistema que, cuando se usa y configura correctamente, puede reducir los costos del ciclo. Android 10 agrega soporte para vDSO32 en kernels de 64 bits (Android ya admite vDSO64 en kernels de 64 bits y vDSO32 en kernels de 32 bits). Usando vDSO32 ( CONFIG_VDSO_COMPAT ) en la arquitectura ARM64 proporciona un aumento del 0,4 por ciento en la vida de la batería y otras mejoras de rendimiento.

La comunidad de Linux está trabajando activamente en la unificación de vDSOs en todas las arquitecturas . Puede configurar vDSO en el núcleo de Linux, permitiendo vDSO32 con CONFIG_COMPAT y CONFIG_CROSS_COMPILE_COMPAT_VDSO con el triplete ARM32 compilador. El equipo de Android kernel ha portado versiones anteriores de la serie de parches vDSO en dispositivos de píxeles, por lo que se pueden encontrar ejemplos en Pixel kernels construídos ( LINUX_FCC_CROSS_COMPILE_ARM32_PREBUILTS_BIN ruta, CROSS_COMPILE_ARM32 de referencia, y CONFIG_CROSS_COMPILE_ARM32 config).

Configuración de ram baja

Ajuste kernel/ActivityManager para reducir la recuperación directa

La recuperación directa ocurre cuando un proceso o el kernel intenta asignar una página de memoria (ya sea directamente o debido a una falla en una nueva página) y el kernel ha usado toda la memoria libre disponible. Esto requiere que el kernel bloquee la asignación mientras libera una página. Esto a su vez requiere a menudo / S de disco para eliminar una página de archivos respaldados sucio o esperar a que lowmemorykiller para detener un proceso. Esto puede resultar en E/S adicional en cualquier subproceso, incluido un subproceso de interfaz de usuario.

Para evitar la recuperación directa, el kernel tiene marcas de agua que desencadenan kswapd o el fondo de recuperación. Este es un hilo que intenta liberar páginas para que la próxima vez que un hilo real asigne, pueda tener éxito rápidamente.

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 núcleo reclama solo unos pocos megabytes de memoria en recuperación de fondo. Esto significa que cualquier proceso que asigne rápidamente más de unos pocos megabytes llegará rápidamente a la recuperación directa.

Se agrega soporte para un kernel ajustable en la rama del kernel de Android-3.4 como parche 92189d47f66c67e5fd92eafaa287e153197a454f ("agregar kbytes ajustables libres adicionales"). Cherry-picking este parche para el kernel de un dispositivo permite ActivityManager para decirle al kernel para tratar de mantener tres de pantalla completa 32 bpp buffers de memoria libre.

Estos umbrales se pueden configurar con el config.xml marco.

<!-- 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 configura los umbrales de la LowMemoryKiller para que coincida con su expectativa del conjunto de trabajo de páginas de archivos respaldados (páginas en caché) necesarios para ejecutar los procesos en cada cubeta nivel de prioridad. Si un dispositivo tiene requisitos elevados para el conjunto de trabajo, por ejemplo, si la interfaz de usuario del proveedor requiere más memoria o si se agregaron más servicios, los umbrales se pueden aumentar.

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 eliminen mucho antes de que se produzca la hipertrofia del disco debido a que la memoria caché se vuelve demasiado pequeña.

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