Kernels comunes de Android

Los kernels comunes de AOSP (también conocidos como kernels comunes de Android o ACK) están en sentido descendente en relación con los kernels kernel.org e incluyen parches de interés para la comunidad de Android que no se combinaron en kernels de línea principal o compatibles con largo plazo (LTS). Estos parches pueden incluir lo siguiente:

  • Portabilidad a versiones anteriores y selecciones exclusivas 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 y OEM que son útiles para otros socios del ecosistema

android-mainline es la rama de desarrollo principal de 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 candidata. Antes de 2019, los kernels comunes de Android se creaban clonando el kernel de LTS recientemente declarado y agregando los parches específicos de Android. Este proceso cambió en 2019 para ramificar el nuevo kernel común de Android de android-mainline. Este nuevo modelo evita el esfuerzo significativo para reenviar el puerto y probar los parches de Android al lograr 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 un nuevo LTS en sentido upstream, el kernel común correspondiente se ramifica desde android-mainline. Esto permite que los socios inicien un proyecto antes de la declaración de la versión de 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 de LTS asociado. Por lo general, estas combinaciones se realizan inmediatamente después de que se publica la versión de LTS. Por ejemplo, cuando se publicó Linux 6.1.75, se combinó con el kernel común 6.1 (android14-6.1). Se recomienda a los socios que actualicen sus kernels para mantenerse actualizados con LTS y las correcciones de errores específicas de 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 exclusiva por la versión de 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 6.1 de GKI para Android 14 se llama android14-6.1. Para Android 15 (experimental de AOSP), se introdujo el kernel de GKI android15-6.6.

Función y lanzamiento de kernels

Antes de Android 15 (experimental de AOSP), se podía usar cualquiera de los tres kernels más recientes para el inicio de dispositivos. A partir de Android 15 (experimental de AOSP), se pueden usar las dos versiones de kernel más recientes para el lanzamiento del dispositivo. Los kernels de lanzamiento para Android 15 (experimental de AOSP) 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 que se diseñaron 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 (experimental de AOSP).

Versión de la plataforma de Android Cómo iniciar kernels Kernels de funciones
Android 15 (AOSP experimental) (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.101
android14-6.1
android14-5.15
Android 13 (2022) android13-5.15
android13-5.10
android12-5.101
android12-5.41
android11-5.41
android13-5.15
android13-5.10
Android 12 (2021) android12-5.10
android12-5.4
android11-5.41
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 mayor o igual que la versión de FCM de destino. Consulta Objeto de interfaz de proveedor: haz coincidir ramas de kernel para obtener más información.

Jerarquía de kernel común

Rama desde android-mainline

En la Figura 1, se muestra el nivel superior de la jerarquía de 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

Observa que se ramificó un nuevo kernel común de Android android14-6.1 desde android-mainline en 2022. En 2023, cuando se declaró la siguiente LTS, android15-6.6 se ramificó desde android-mainline.

Como se muestra en la Figura 1, cada versión de kernel puede ser la base de dos kernels de GKI. Por ejemplo, los dos kernels de la versión 5.15 son android13-5.15 y android14-5.15, los cuales son kernels de funciones para sus respectivas versiones de plataforma. Este también fue el caso de 5.10. android12-5.10 se creó cuando se declaró la LTS y android13-5.10 se ramificó desde android12-5.10 en la versión principal 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 (experimental de AOSP) (2024), solo hay un kernel de GKI nuevo por versión de kernel (no hay 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 la rama, la Figura 2 se enfoca en las ramas de KMI de ACK para la versión 6.6.

Cada rama de KMI de ACK pasa por las tres fases que se indican en la Figura 2 con colores diferentes en cada rama. Como se muestra, LTS se combina con regularidad, independientemente de la fase.

Fase de desarrollo

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

Fase de estabilización

Cuando se declara que la rama de KMI de ACK es la función completa, entra en la fase de estabilización (etiquetada como stable 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 a 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 inmovilizada 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 rotundos de KMI, a menos que se identifique un problema de seguridad grave que no se pueda mitigar sin afectar el KMI estable. Para evitar fallas de KMI, es posible que algunos parches combinados de LTS se modifiquen o se descarten si no se requiere la corrección para los dispositivos Android.

Cuando se bloquea una rama de KMI de ACK, se pueden aceptar las correcciones de errores y las funciones de socios, siempre y cuando el kernel común de KMI existente no esté dañado. El KMI se puede extender con nuevos símbolos exportados siempre que las interfaces que comprenden el KMI actual no se vean afectadas. 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 utilizada por el kernel común de una 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, puedes agregar una nueva función:

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, se puede usar el kernel android15-6.6 para dispositivos con Android 15 (experimental de AOSP) y dispositivos posteriores. Debido a que la versión de la plataforma de Android también es compatible con versiones anteriores, el kernel android14-6.1 podría usarse en dispositivos con Android 15 (experimental de AOSP) 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 la aceptación de un parche de cambio de KMI, el número de generación de KMI registrado en build.config.common aumenta. 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 la generación de KMI cambia, el kernel no es compatible con los módulos de proveedores que se ajustan a la generación anterior de KMI, 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 kernels en la misma familia LTS están cambiando 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 (experimental de AOSP) (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, por lo que el kernel se puede actualizar sin necesidad de volver a compilar los módulos de kernel en la imagen del proveedor.

La compatibilidad con KMI no se mantiene entre diferentes kernels de GKI. Entonces, 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 de android15-6.6 no es compatible con los 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 (AOSP experimental) (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 kernels comunes de Android son compatibles hasta que el kernel LTS asociado o la versión de la plataforma de Android dejen de ser compatibles. Si bien un kernel es compatible, sigue recibiendo combinaciones de LTS de correcciones de errores y upstream para código específico de Android. Estas correcciones incluyen todos los parches de seguridad de kernel citados en los Boletines de seguridad de Android mensuales que son relevantes para los kernels comunes de Android.

Los socios pueden confiar en que, si usan kernels de GKI, obtendrán todos los parches de seguridad del kernel posibles.

Pruebas comunes de 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 la 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 inicio 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 antes 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 del resultado de la prueba se puede encontrar en la pestaña "Verificaciones" del cambio de código en el gerrit del kernel común de Android.

Las pruebas posteriores al envío de Android se realizan en nuevas compilaciones publicadas en las ramas de kernel común de Android cuando se confirman nuevos parches en una rama de kernel común de Android en ci.android.com. Si ingresas aosp_kernel como nombre parcial de la rama 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, encontrará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 fuentes de la plataforma de Android se ejecutarán como envío previo para las ramas de 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 presbumit en el registro de código del kernel común de Android.

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

Prueba de día cero

Las pruebas de días 0 realizan pruebas de parche por parche en todas las ramas de kernel común 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 Posterior al envío día cero
android-mainline
android5-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 la línea principal de Linux y no en los kernels comunes de Android. Se recomienda encarecidamente el desarrollo ascendente, y una vez que el desarrollo se acepte allí, se puede adaptar fácilmente a la rama ACK específica según sea necesario. El equipo de kernel de Android se complace en brindar asistencia durante los esfuerzos ascendentes en beneficio del ecosistema de Android.

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