Kernels comunes de Android

Los kernels comunes de AOSP (también conocidos como kernels comunes de Android o ACK) son downstream de los kernels de kernel.org y, además, incluyen parches de interés para la comunidad de Android que no se combinaron en los kernels principales ni en los de compatibilidad a largo plazo (LTS). Estos parches pueden incluir lo siguiente:

  • Portabilidad a versiones anteriores y selección de funciones ascendentes necesarias para las funciones de Android
  • Funciones disponibles para dispositivos Android, pero que aún se encuentran en desarrollo
  • Funciones de proveedores o OEM que son útiles para otros socios del ecosistema

android-mainline es la rama de desarrollo principal para las funciones de Android. La línea principal de Linux se combina con android-mainline cada vez que Linus Torvalds publica una versión o una versión potencial. Antes de 2019, los kernels comunes de Android se compilaban clonando el kernel LTS declarado recientemente y agregando los parches específicos de Android. Este proceso cambió en 2019 para bifurcar el nuevo kernel común de Android desde android-mainline. Este nuevo modelo evita el esfuerzo significativo de reenviar el puerto y probar los parches de Android, ya que logra el mismo resultado de forma incremental. android-mainline se somete a pruebas continuas significativas. Este modelo garantiza un kernel de alta calidad desde el día en que se publica.

Cuando se declara una nueva LTS en upstream, el kernel común correspondiente se deriva de android-mainline. Esto permite a los socios comenzar un proyecto antes de la declaración de la versión LTS mediante la combinación desde android-mainline. Después de crear la nueva rama de kernel común, los socios pueden cambiar sin problemas la fuente de combinación a la nueva rama.

Otras ramas de kernel comunes reciben fusiones regulares de su kernel LTS asociado. Por lo general, estas combinaciones se realizan inmediatamente después de que se publica la versión LTS. Por ejemplo, cuando se publicó Linux 6.1.75, se fusionó en el kernel común 6.1 (android14-6.1). Se recomienda a los socios que actualicen sus kernels para mantenerse al día con las correcciones de errores específicas de LTS y Android.

Rama del kernel de KMI de ACK

Los kernels de GKI tienen una interfaz de módulo de kernel estable. El KMI se identifica de forma única con la versión del kernel y la versión de la plataforma de Android, por lo que las ramas se denominan ANDROID_RELEASE-KERNEL_VERSION. Por ejemplo, el kernel de GKI 6.1 para Android 14 se denomina android14-6.1. Para Android 15, se introdujo el kernel android15-6.6 de GKI.

Funciones y lanzamientos de kernels

Antes de Android 15, se podía usar cualquiera de los tres kernels más recientes para el inicio del dispositivo. A partir de Android 15, se pueden usar las dos versiones de kernel más recientes para el inicio del dispositivo. Los kernels de lanzamiento para Android 15 son android15-6.6 y android14-6.1.

Debido a que las actualizaciones de kernel no son necesarias cuando se actualiza la versión de la plataforma, los kernels a los que les falten las funciones más recientes de un lanzamiento de plataforma aún se pueden usar para iniciar dispositivos. Por lo tanto, los kernels diseñados para Android 14, como android14-6.1, se pueden usar en dispositivos incluso después de actualizar la versión de la plataforma a Android 15.

Versión de la plataforma de Android Cómo iniciar kernels Kernels de funciones
Android 15 (2024) android15-6.6
android14-6.1
android15-6.6
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android12-5.10
android12-5.4
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

1 Es posible que se apliquen restricciones adicionales si el BSP asociado se actualizó para la versión de la plataforma. En términos más generales, el número de versión de Android del kernel debe ser superior o igual a la versión de FCM objetivo. Consulta Objeto de interfaz de proveedor: Haz coincidir las ramas del kernel para obtener más detalles.

Jerarquía de kernel común

Rama de android-mainline

En la Figura 1, se muestra el nivel superior de la jerarquía del kernel común.

Cómo crear kernels comunes a partir del kernel de android-mainline

Figura 1: Cómo crear kernels comunes a partir del kernel de android-mainline

Ten en cuenta que se creó una nueva rama de kernel común de Android android14-6.1 a partir de android-mainline en 2022. En 2023, cuando se declaró la siguiente LTS, android15-6.6 se ramificó de android-mainline.

Como se muestra en la Figura 1, cada versión del kernel puede ser la base de dos kernels de GKI. Por ejemplo, los dos kernels de la v5.15 son android13-5.15 y android14-5.15, ambos son kernels de funciones para sus respectivas versiones de plataforma. Este también fue el caso de la versión 5.10. android12-5.10 se creó cuando se declaró la LTS y android13-5.10 se ramificó de android12-5.10 en el hito de finalización de la función del kernel en la primavera de 2021 para permitir el desarrollo de funciones para Android 13. A partir de Android 15 (2024), solo hay un kernel GKI nuevo por versión de kernel (no hay un kernel android15-6.1).

Ciclo de vida de la rama de KMI de ACK

El ciclo de vida de una rama de KMI de ACK se muestra a continuación, en la Figura 2.

6.6 Ciclo de vida de la rama de KMI de ACK

Figura 2: 6.6 Ciclo de vida de la rama de KMI de ACK

Para aclarar el proceso de desarrollo y el ciclo de vida de las ramas, la Figura 2 se enfoca en las ramas de KMI de ACK para la versión 6.6.

Cada rama de KMI de ACK realiza un ciclo de tres fases que se indican en la Figura 2 con diferentes colores en cada rama. Como se muestra, la LTS se combina con frecuencia, independientemente de la fase.

Fase de desarrollo

Cuando se crea, una rama de KMI de ACK entra en la fase de desarrollo (etiquetada como dev en la Figura 2) y está abierta para contribuciones de funciones para la próxima versión de la plataforma de Android. En la Figura 2, se creó android15-6.6 cuando se declaró 6.6 como el nuevo kernel LTS upstream.

Fase de estabilización

Cuando se declara que la rama de KMI de ACK tiene la función completa, entra en la fase de estabilización (etiquetada como estable en la Figura 2). Aún se aceptan las funciones de socios y las correcciones de errores, pero el seguimiento de KMI está habilitado para detectar cualquier cambio que afecte la interfaz. En esta fase, se aceptan los cambios rotundos de KMI y la definición de KMI se actualiza con una cadencia predefinida (por lo general, cada dos semanas). Consulta la descripción general de GKI para obtener detalles sobre la supervisión de KMI.

Fase de inactividad de KMI

Antes de enviar una nueva versión de la plataforma al AOSP, la rama ACK de KMI se congela y permanece sin cambios durante el ciclo de vida de la rama. Esto significa que no se aceptan cambios que rompan la KMI, a menos que se identifique un problema de seguridad grave que no se pueda mitigar sin afectar la KMI estable. Para evitar fallas de KMI, es posible que algunos parches combinados de LTS se modifiquen o descarten si no se requiere la corrección para los dispositivos Android.

Cuando se inmoviliza una rama de KMI de ACK, se pueden aceptar correcciones de errores y funciones de socios, siempre que el kernel común de KMI existente no esté dañado. El KMI se puede extender con nuevos símbolos exportados, siempre y cuando no se vean afectadas las interfaces que componen el KMI actual. Cuando se agregan interfaces nuevas al KMI, se vuelven estables de inmediato y no se pueden interrumpir por cambios futuros.

Por ejemplo, no se permite un cambio que agregue un campo a una estructura que usa un kernel común de la interfaz de KMI porque cambia la definición de la interfaz:

struct foo {
  int original_field1;
  int original_field2;
  int new_field;  // Not allowed
};

int do_foo(struct foo &myarg)
{
  do_stuff(myarg);
}
EXPORT_SYMBOL_GPL(do_foo);

Sin embargo, agregar una función nueva es correcto:

struct foo2 {
  struct foo orig_foo;
  int new_field;
};

int do_foo2(struct foo2 &myarg)
{
  do_stuff2(myarg);
}
EXPORT_SYMBOL_GPL(do_foo2);

Durante la vida útil del kernel de GKI, se mantiene la retrocompatibilidad con el espacio del usuario, de modo que este pueda usarse de manera segura para la versión de la plataforma de Android con la que se lanzó el dispositivo. Las pruebas continuas con versiones anteriores garantizan que se mantenga la compatibilidad. Por lo tanto, en la Figura 2, el kernel android15-6.6 se puede usar para dispositivos Android 15 y versiones posteriores. Debido a que la versión de la plataforma de Android también es compatible con versiones anteriores, el kernel android14-6.1 se puede usar para dispositivos Android 15, ya sea para el lanzamiento o la actualización.

Número de generación de KMI

Si hay una combinación de LTS durante la fase de estabilización o un problema de seguridad o algún otro evento después de esto que requiera que se acepte un parche que cambie la KMI, se incrementa el número de generación de la KMI registrado en build.config.common. La generación actual de KMI se puede encontrar con el comando uname:

$ uname -r
6.6.30-android15-6-g86d10b30f51f

El número después del lanzamiento de la plataforma es la generación de KMI (en este caso, 6).

Si cambia la generación de KMI, el kernel no es compatible con los módulos del proveedor que se ajustan a la generación de KMI anterior, por lo que los módulos deben volver a compilarse y actualizarse de forma síncrona con el kernel. Después de que se suspenda KMI, se espera que los cambios en la generación de KMI sean muy raros.

Compatibilidad entre kernels

Los requisitos de compatibilidad entre los kernels de la misma familia de LTS cambiarán a partir de los nuevos kernels de GKI.

Kernels de GKI

Los kernels de GKI mantienen la retrocompatibilidad con todas las versiones de la plataforma de Android que admiten la versión de kernel. Además, las versiones de la plataforma de Android son retrocompatibles con los kernels de GKI de versiones anteriores. Por lo tanto, puedes usar de forma segura el kernel android14-6.1 desarrollado para Android 14 (2023) en dispositivos que ejecutan Android 15 (2024). La compatibilidad se verifica mediante pruebas continuas de VTS y CTS de los kernels de GKI con todas las versiones compatibles.

El KMI es estable para que el kernel se pueda actualizar sin necesidad de volver a compilar los módulos del kernel en la imagen del proveedor.

La compatibilidad de KMI no se mantiene entre diferentes kernels de GKI. Por lo tanto, por ejemplo, un kernel android14-6.1 no se puede reemplazar por un kernel android15-6.6 sin volver a compilar todos los módulos.

Los kernels de GKI solo son compatibles con sus versiones iniciales y posteriores. No son compatibles con versiones anteriores. Por lo tanto, un kernel android15-6.6 no es compatible con dispositivos que ejecutan Android 14 (2023).

Matriz de compatibilidad

En esta tabla, se muestran las versiones de kernel compatibles y probadas con cada versión de la plataforma de Android.

Versión de la plataforma de Android Kernels compatibles para la actualización Kernels compatibles para el lanzamiento
Android 15 (2024) android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android15-6.6
android14-6.1
Android 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Android 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Android 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Android 11 (2020) android11-5.4
android-4.19-stable
android11-5.4
android-4.19-stable

Compatibilidad con duración y parches de seguridad

Los ACKs reciben fusiones de LTS de la fuente y correcciones de errores para el código específico de Android. Estas correcciones incluyen todos los parches de seguridad del kernel que se mencionan en los Boletines de seguridad de Android mensuales que son relevantes para ACK.

Es posible que los ACK sean compatibles durante más tiempo que el kernel estable upstream correspondiente en kernel.org. En este caso, Google proporciona asistencia extendida hasta la fecha de fin del ciclo de vida (EOL) que se muestra en esta sección. Cuando los kernels se EOL, ya no son compatibles con Google, y los dispositivos que los ejecutan se consideran vulnerables.

A partir del kernel 6.6, el ciclo de vida de la asistencia para los kernels estables es de 4 años.

En esta tabla, se muestran las duraciones de los ACK compatibles:

Rama de ACK Fecha de
lanzamiento
Asistencia
de por vida
(años)
EOL
estable-android-4.19 2018-10-22 6 2025-01-01
android11-5.4 2019-11-24 6 2026-01-01
android12-5.4 2019-11-24 6 2026-01-01
android12-5.10 2020-12-13 6 2027-07-01
android13-5.10 2020-12-13 6 2027-07-01
android13-5.15 2021-10-31 6 2028-07-01
android14-5.15 2021-10-31 6 2028-07-01
android14-6.1 2022-12-11 6 2029-07-01
android15-6.6 2023-10-29 4 2028-07-01

Pruebas comunes del kernel

Los kernels comunes se prueban con varios sistemas de CI, además de las pruebas downstream que realizan los proveedores.

Prueba funcional del kernel de Linux

Las pruebas de prueba funcional del kernel de Linux (LKFT) inician varios paquetes de pruebas, incluidos kselftest, LTP, VTS y CTS, en un conjunto de dispositivos físicos arm32 y arm64. Puedes encontrar los resultados de las pruebas recientes aquí.

Pruebas de KernelCI

Las pruebas de compilación y arranque de KernelCI se inician cada vez que se confirma un nuevo parche en una rama de kernel común. Se prueban y se inician en varias placas cientos de configuraciones de compilación. Puedes encontrar los resultados recientes de los kernels de Android aquí.

Pruebas previas al envío y después del envío de Android

Las pruebas antes del envío se usan para evitar que se introduzcan fallas en los kernels comunes de Android. El resumen de los resultados de la prueba se puede encontrar en la pestaña "Verificaciones" del cambio de código en Gerrit del kernel común de Android.

Las pruebas después del envío de Android se realizan en compilaciones publicadas nuevas en ramas de kernel comunes de Android cuando se confirman parches nuevos en una rama de kernel común de Android en ci.android.com. Si ingresas aosp_kernel como nombre de rama parcial en ci.android.com, verás una lista de ramas de kernel con resultados disponibles. Por ejemplo, los resultados de android-mainline se pueden encontrar aquí. Cuando hagas clic en una compilación en particular, verás el estado de la prueba en la pestaña Test Results.

Las pruebas definidas por test-mapping con el grupo de prueba kernel-presubmit en el árbol de origen de la plataforma de Android se ejecutarán como envío previo para las ramas del kernel de Android. Por ejemplo, la siguiente configuración en test/vts/tests/kernel_proc_file_api_test/TEST_MAPPING habilitará vts_kernel_proc_file_api_test como prueba de envío previo en el registro de código del kernel común de Android.

{
  "kernel-presubmit": [
    {
      "name": "vts_kernel_proc_file_api_test"
    }
  ]
}

Pruebas de día cero

Las pruebas de Día Cero realizan pruebas de parche por parche en todas las ramas de kernel comunes de Android cuando se confirman parches nuevos. Se ejecutan varias pruebas de inicio, funcionales y de rendimiento. Únete al grupo público cros-kernel-buildreports.

Matriz de pruebas

Kernel común de Android Versiones de la plataforma de Android Paquetes de pruebas
Principal 15 14 13 12 11 10 KF KernelCI Antes del envío Publicación después del envío día cero
android-mainline
android15-6.6
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable

Cómo contribuir a los kernels comunes de Android

Por lo general, el desarrollo de funciones debe realizarse en Linux principal y no en kernels comunes de Android. Se recomienda encarecidamente el desarrollo upstream y, después de que se acepte el desarrollo allí, se puede portar fácilmente a la rama específica de ACK según sea necesario. El equipo del kernel de Android con gusto apoya los esfuerzos de integración para el beneficio del ecosistema de Android.

Envía parches a Gerrit y cumple con estos lineamientos de contribución.