Kernels comunes de Android

Kernel comunes de AOSP (también conocidos como kernels comunes de Android o ACK) están en sentido descendente kernels de kernel.org e incluye parches de interés para la comunidad de Android que no se hayan fusionado con la línea principal o Kernels compatibles a largo plazo (LTS). Estos parches pueden incluir lo siguiente:

  • Adaptaciones y selección especial de funciones ascendentes que son necesarias para Android funciones
  • 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. Linux la línea principal se combina con android-mainline cada vez que Linus Torvalds publica un o una versión candidata. Antes de 2019, los kernels comunes de Android se construido mediante la clonación del kernel LTS declarado recientemente y la adición del Parches específicos de Android. Este proceso cambió en 2019 para ramificar el nuevo Android kernel común de android-mainline. Con este nuevo modelo, se evitan las pérdidas para reenviar el puerto y probar los parches de Android al obtener el mismo resultado. de forma incremental. android-mainline se somete a pruebas continuas significativas. garantiza un kernel de alta calidad desde el día de su publicación.

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

Otras ramas comunes de kernel reciben fusiones regulares de sus Kernel de LTS Por lo general, estas combinaciones se realizan inmediatamente después de que se publica la versión de LTS. Para ejemplo, cuando se publicó Linux 6.1.75, se combinó con la versión 6.1 kernel (android14-6.1) Se recomienda encarecidamente a los socios que hagan lo siguiente: actualizan sus kernels para mantenerse actualizados con LTS y las correcciones de errores específicos de Android.

Rama del kernel de KMI de ACK

Los kernels de GKI tienen una interfaz de módulo de kernel estable. El KMI es único identificados por la versión de kernel y la versión de la plataforma de Android, por lo que las ramas tienen nombre ANDROID_RELEASE-KERNEL_VERSION Por ejemplo, el GKI 6.1 de Android 14 se llama android14-6.1. Para Android 15 (experimental de AOSP), el kernel de GKI android15-6.6 era que se presentaron.

Función y lanzamiento de kernels

Antes de Android 15 (experimental de AOSP), cualquiera de los tres kernels más recientes. para iniciar dispositivos. Para empezar Android 15 (experimental de AOSP), las dos versiones más recientes de kernel pueden usarse para iniciar dispositivos. Los kernels de lanzamiento de Android 15 (experimental de AOSP) son android15-6.6 y android14-6.1.

Porque no se requieren actualizaciones de kernel cuando se actualiza la plataforma una versión nueva, los kernels a los que les faltan las últimas funciones para un lanzamiento de plataforma pueden todavía se usa para lanzar dispositivos. Por lo tanto, los kernels diseñados para Android 14, como android14-6.1, se puede usar en incluso después de actualizar la versión de la plataforma a Android 15 (AOSP experimental)

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 tiene para el lanzamiento 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 el versión de FCM de destino. Consulta Objeto de interfaz de proveedor: haz coincidir ramas de kernel para conocer los detalles.

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 próxima 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, ambas son kernels de funciones para sus respectivas versiones de plataforma. Esta fue el caso de 5.10 también; Se creó android12-5.10 cuando se creó la LTS se declaró y android13-5.10 se ramificó desde android12-5.10 en el kernel objetivo completo de características en la primavera de 2021 para permitir el desarrollo de características para Android 13 Primeros pasos con 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 centra en Ramas de KMI de ACK para 6.6

Cada rama de KMI de ACK pasa por las tres fases que se indican en la Figura 2 diferentes colores en cada rama. Como se muestra, LTS se combina con regularidad sin importar 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á abierto a las contribuciones de funciones para la próxima versión de Android lanzamiento de la plataforma. En la Figura 2, se creó android15-6.6 cuando se creó 6.6 declarado como el nuevo kernel LTS upstream.

Fase de estabilización

Cuando la rama de ACK de KMI se declara como función completa, ingresa fase de estabilización (etiquetada como stable en la Figura 2). las funciones para socios Aún se aceptan las correcciones de errores, pero el seguimiento de KMI está habilitado para detectar cualquier cambio. que afectan la interfaz. En esta fase, se aceptan los cambios rotundos de KMI. y la definición de KMI se actualiza según una cadencia predefinida (normalmente, cada dos semanas). Consulta la Descripción general de GKI de 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 inmovilizada durante la vida útil de la rama. Esto significa que Se aceptan los cambios rotundos del KMI, a menos que se identifique un problema de seguridad grave. que no se pueden mitigar sin afectar el KMI estable. Para evitar el KMI algunos parches combinados de LTS podrían modificarse o descartarse si la corrección no es necesario para los dispositivos Android.

Cuando se inmoviliza una rama de KMI de ACK, se pueden aceptar las correcciones de errores y las 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 las interfaces que contengan el KMI actual no se ven afectadas. Cuando se agregan interfaces nuevas al KMI, se les ocurre se vuelvan estables y no se rompan con los cambios futuros.

Por ejemplo, un cambio que agrega un campo a una estructura utilizada por una interfaz de KMI no se permite el kernel común 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, la retrocompatibilidad con el espacio del usuario es para que el kernel pueda usarse de manera segura en la plataforma de Android. de lanzamiento con el que se lanzó el dispositivo. Pruebas continuas con versiones anteriores garantiza que se mantenga la compatibilidad. Por lo tanto, en la Figura 2, el elemento android15-6.6 kernel puede usarse para dispositivos con Android 15 (AOSP experimental) y versiones posteriores. dispositivos. Como la versión de la plataforma de Android es compatible con versiones anteriores, se podría usar el kernel android14-6.1 para dispositivos con Android 15 (experimental de AOSP) ya sea para el lanzamiento o la actualización.

Número de generación de KMI

Si hay una fusión de LTS durante la fase de estabilización, o bien un problema de seguridad evento posterior que requiera que se acepte un parche de cambio de KMI, Aumenta el número de generación de KMI registrado en build.config.common. El Puedes encontrar la generación actual del KMI 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 ajusten a la generación anterior de KMI, por lo que los módulos deben volver a compilarse y se actualizan de forma síncrona con el kernel. Después de que se suspenda KMI, la generación de KMI cambiará se espera que sean muy raros.

Compatibilidad entre kernels

Los requisitos de compatibilidad entre kernels en la misma familia LTS son los siguientes: con los nuevos kernels de GKI.

Kernels de GKI

Los kernels de GKI mantienen la retrocompatibilidad con todas las plataformas de Android. versiones compatibles con la versión de kernel. Además, la plataforma de Android son retrocompatibles con kernels de GKI de versiones anteriores. De esta manera, puedes usar de forma segura el kernel android14-6.1 desarrollado para Android 14 (2023) en dispositivos con Android 15 (AOSP experimental) (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, de modo que el kernel se puede actualizar sin necesidad de volver a compilar de 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 android15-6.6. kernel 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. Entonces, El kernel android15-6.6 no es compatible con los dispositivos en ejecución Android 14 (2023).

Matriz de compatibilidad

En esta tabla, se muestran las versiones de kernel compatibles y probadas con cada sistema operativo lanzamiento de la plataforma.

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 ACK reciben 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 el boletín mensual de Android Boletines de seguridad 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 del final del ciclo de vida (EOL) que se muestra en este sección. Cuando los kernels se EOL, ya no están compatibles con Google y los dispositivos que las ejecutan se consideran vulnerables.

A partir del kernel 6.6, la vida útil de compatibilidad de los kernels estables es 4 años.

En esta tabla, se muestran los ciclos de vida de las confirmaciones admitidas:

Rama de ACK Fecha de
lanzamiento
Asistencia
desde el principio
(años)
EOL
estable 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 de kernel

Los kernels comunes se prueban con varios sistemas de CI, además de downstream y pruebas por parte de los proveedores.

Prueba funcional del kernel de Linux

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

Pruebas de KernelCI

Las pruebas de compilación y inicio de KernelCI cada vez que se confirma un nuevo parche en una rama de kernel común. Varios se prueban y se inician en varias placas. Reciente puedes encontrar los resultados de los kernels de Android aquí.

Pruebas antes y después del envío de Android

Las pruebas previas al envío se usan para evitar que se introduzcan fallas en el Kernels comunes de Android El resumen de los resultados de la prueba se encuentra en “Verificaciones”. del cambio de código en gerrit del kernel común de Android.

Se realizan pruebas posteriores al envío de Android en las 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. Ingresando aosp_kernel como nombre de rama parcial en ci.android.com, verás una lista de ramas de kernel con disponibles. Por ejemplo, se pueden encontrar resultados para android-mainline 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 0 días realizan pruebas de parche por parche. en todas las ramas de kernel común de Android cuando se confirman nuevos parches. Varios de inicio, funcionales y de rendimiento. Unirse 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
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

Generalmente, el desarrollo de funciones debe realizarse en la línea principal de Linux y no en Kernels comunes de Android Se recomienda encarecidamente el desarrollo ascendente y, después el desarrollo se acepta allí, puede ser fácil de adaptar a la ACK específica . El equipo de kernel de Android es y me complace respaldar iniciativas ascendentes en beneficio del ecosistema de Android.

Cómo enviar parches a Gerrit y cumplan con estos lineamientos de contribución.