Núcleos comunes de Android

Los kernels comunes de AOSP (también conocidos como kernels comunes de Android o ACK ) son posteriores a los kernels de kernel.org e incluyen parches de interés para la comunidad de Android que no se han fusionado con los kernels principales o con soporte a largo plazo (LTS). Estos parches pueden incluir:

  • Backports y selecciones de funcionalidad ascendente necesarias para las funciones de Android
  • Funciones listas para dispositivos Android pero aún en desarrollo (por ejemplo, optimizaciones de ubicación de tareas de Energy Aware Scheduler).
  • Funciones de proveedor/OEM que son útiles para otros socios del ecosistema (por ejemplo, sdcardfs).

android-mainline es la rama de desarrollo principal para las funciones de Android. La línea principal de Linux se fusiona con android-mainline cada vez que Linus Torvalds publica una versión o una versión candidata. Antes de 2019, los kernels comunes de Android se construían clonando el kernel LTS recientemente declarado y agregando parches específicos de Android. Este proceso cambió en 2019 para ramificar el nuevo kernel común de Android desde android-mainline . Este nuevo modelo evita el importante esfuerzo de reenviar puertos y probar parches de Android al lograr el mismo resultado de forma incremental. android-mainline se somete a importantes pruebas continuas; este modelo garantiza un kernel de alta calidad desde el día de su publicación.

Cuando se declara un nuevo LTS en sentido ascendente, el núcleo común correspondiente se ramifica desde android-mainline . Esto permite a los socios comenzar un proyecto antes de la declaración de la versión LTS, fusionándose desde android-mainline . Una vez creada la nueva rama común del kernel, los socios pueden cambiar sin problemas la fuente de fusión a la nueva rama.

Otras ramas comunes del kernel reciben fusiones periódicas de su kernel LTS asociado. Estas fusiones normalmente se realizan inmediatamente después de que se publica la versión LTS. Por ejemplo, cuando se publicó Linux 4.19.64, se fusionó con los núcleos comunes 4.19 (por ejemplo, android-4.19-q ). Se recomienda encarecidamente a los socios que fusionen periódicamente los núcleos comunes con los núcleos de sus productos para mantenerse actualizados con LTS y correcciones de errores específicos de Android.

Rama del kernel ACK KMI

Los núcleos GKI tienen una interfaz de módulo de núcleo estable. El KMI se identifica de forma única por la versión del kernel y la versión de la plataforma Android, por lo que las ramas se denominan <androidRelease>-<kernel version> . Por ejemplo, el kernel 5.4 GKI para Android 11 se llama android11-5.4. Para Android 12 hay dos núcleos GKI adicionales, android12-5.4 y android12-5.10 .

Ramas de núcleo de postre heredadas

Los kernels de postres heredados se crearon para garantizar que el desarrollo de nuevas funciones no interfiriera con la fusión del kernel común de Android. Las ramas se crearon antes del lanzamiento del postre asociado y reciben fusiones regulares de LTS, pero no tienen características nuevas. Por ejemplo, android-4.9-q recibe fusiones de la rama LTS 4.9.y.

Si una versión del kernel no era un kernel de lanzamiento, no se creó ningún kernel de postre, pero el kernel asociado con la versión más reciente de la plataforma es válido para actualizar a futuras versiones de la plataforma Android. Por ejemplo, android-4.9-q fue la última de las ramas postreras android-4.9* , por lo que es compatible y probado con su versión de plataforma original, Android 10. También es compatible y probado con las versiones de plataforma que admiten actualizaciones de dispositivos que ejecutan 4.9. núcleos: Android 11 y Android 12.

Debido a que el esquema de nombres de postres para las versiones de la plataforma Android se eliminó con Android 10, los últimos lanzamientos de postres que se habrían llamado android-4.14-r y android-4.19-r se llamaron en su lugar android-4.14-stable y android-4.19-stable .

Los núcleos de postre son reemplazados por núcleos GKI a partir de Android 11, por lo que la lista completa de núcleos de postre compatibles se encuentra en esta tabla.

Lanzamiento de la plataforma Android Núcleo Apoyado hasta
androide 10 android-4.9-q
android-4.14-q
android-4.19-q
enero 2023
androide 11 android-4.14-stable
android-4.19-stable
enero 2024

Ramas del kernel de versión heredada

Los kernels de versión se mantienen para proporcionar versiones anteriores de los parches citados en el Boletín de seguridad mensual de Android . Fueron creados para cada kernel de lanzamiento cuando hubo un nuevo lanzamiento de plataforma Android. Quedan obsoletos cuando la versión del kernel o de la plataforma asociada queda obsoleta, como se describe en Duración del soporte y parches de seguridad .

Cada mes, cuando se publica el Boletín de seguridad de Android, estos núcleos se actualizan con versiones anteriores de los parches citados en el boletín que son relevantes para los núcleos anteriores y los núcleos comunes de Android. No reciben parches LTS, por lo que el número de versión menor nunca cambia. No contienen backports para parches específicos de proveedores.

En Android 11 y versiones posteriores de la plataforma, los socios deben fusionar núcleos postres o GKI para aplicar los parches citados en el Boletín de seguridad de Android. No se creará ningún kernel de versión para Android 11 o versiones posteriores de la plataforma.

Por lo tanto, en esta tabla se muestra la lista completa de los 14 kernels de lanzamiento y no se agregará ninguno.

Lanzamiento de la plataforma Android Núcleo Apoyado hasta
androide 10 android-4.9-q-release
android-4.14-q-release
android-4.19-q-release
enero 2023

Funciones y lanzamiento de kernels

Cada versión de la plataforma Android admite el lanzamiento de nuevos dispositivos basados ​​en cualquiera de las tres versiones del kernel de Linux. Como se muestra en la siguiente tabla, los kernels de lanzamiento para Android 11 son android-4.14-stable , android-4.19-stable y android11-5.4 .

Debido a que las actualizaciones del kernel generalmente no son necesarias al actualizar la versión de la plataforma, los kernels a los que les faltan las funciones más recientes para una versión de la plataforma aún se pueden usar para iniciar dispositivos. Por lo tanto, los kernels que fueron diseñados para Android 10, como android-4.19-q , se pueden usar en dispositivos incluso después de actualizar la versión de la plataforma a Android 11. A partir de Android 12, habrá menos kernels de funciones que kernels de lanzamiento para limitar la cantidad de KMI estables que deben ser compatibles.

Lanzamiento de la plataforma Android Lanzar núcleos Núcleos de características
Androide 14 (2023) android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10 1
android14-6.1
android14-5.15
Androide 13 (2022) android13-5.15
android13-5.10
android12-5.10 1
android12-5.4 1
android11-5.4 1
android13-5.15
android13-5.10
Androide 12 (2021) android12-5.10
android12-5.4
android11-5.4 1
android-4.19-stable
android12-5.10
android12-5.4
Androide 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.19-q
android-4.14-q
android-4.9-q

android-4.19-q
android-4.14-q
android-4.9-q

1 Pueden aplicarse restricciones adicionales si el BSP asociado se ha actualizado 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 a la versión FCM de destino . Consulte Objeto de interfaz del proveedor: coincida con las ramas del kernel para obtener más detalles.

Jerarquía de núcleo común

Rama de Android-mainline

El nivel superior de la jerarquía del kernel común se muestra en la Figura 1.

Creación de núcleos comunes a partir del núcleo principal de Android

Figura 1. Creación de núcleos comunes a partir del núcleo principal de Android

Tenga en cuenta que el nuevo kernel común de Android, android12-5.10 , se ramificó desde android-mainline en 2020. En 2021, cuando se declaró el próximo LTS, android13-5.15 se ramificó desde android-mainline .

Como se muestra en la Figura 1, cada versión del kernel es la base para dos kernels GKI. Por ejemplo, los dos kernels v5.4 son android11-5.4 y android12-5.4 , los cuales son kernels característicos para sus respectivas versiones de plataforma. Este será el caso también para 5.10; android12-5.10 se creó cuando se declaró LTS y android13-5.10 se bifurcará desde android12-5.10 en el hito completo de funciones del kernel en la primavera de 2021 para permitir el desarrollo de funciones para Android 13.

Ciclo de vida de la sucursal ACK KMI

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

5.10 Ciclo de vida de la sucursal ACK KMI

Figura 2. 5.10 Ciclo de vida de la rama ACK KMI

Para aclarar el proceso de desarrollo y el ciclo de vida de las ramas, la Figura 2 se centra en las ramas ACK KMI para 5.10.

Cada rama de ACK KMI pasa por tres fases indicadas en la Figura 2 por diferentes colores en cada rama. Como se muestra, LTS se fusiona periódicamente independientemente de la fase.

Fase de desarrollo

Cuando se crea, una rama ACK KMI ingresa a la fase de desarrollo ( dev en la Figura 2) y está abierta para contribuciones de funciones para la próxima versión de la plataforma Android. En la Figura 2, android12-5.10 se creó cuando se declaró 5.10 como el nuevo kernel LTS ascendente. La segunda rama ACK KMI para una versión del kernel podría crearse antes para permitir el desarrollo de la versión posterior. En la Figura 2, android13-5.10 se crea cuando android12-5.10 sale de la fase de desarrollo.

Fase de estabilización

Cuando la rama ACK KMI se declara como función completa, ingresa a la fase de estabilización , etiquetada como puñalada en la Figura 2. Aún se aceptan funciones de socios y correcciones de errores, pero el seguimiento de KMI está habilitado para detectar cualquier cambio que afecte a la interfaz. En esta fase, se aceptan cambios importantes de KMI, pero la definición de KMI debe actualizarse según sea necesario. Consulte la descripción general de GKI para obtener detalles sobre el monitoreo de KMI.

Fase congelada de KMI

Antes de enviar una nueva versión de plataforma a AOSP, la rama ACK KMI se congela y permanece congelada durante toda la vida útil de la rama. Esto significa que no se aceptan cambios que rompan el KMI a menos que se identifique un problema de seguridad grave que no pueda mitigarse sin afectar el KMI estable. Para evitar roturas de KMI, algunos parches fusionados desde LTS podrían modificarse o eliminarse si la solución no es necesaria para los dispositivos Android.

Cuando una rama ACK KMI está congelada, se pueden aceptar correcciones de errores y funciones de socios siempre que el kernel común de KMI existente no esté roto. El KMI se puede ampliar con nuevos símbolos exportados siempre que las interfaces que componen el KMI actual no se vean afectadas. Cuando se agregan nuevas interfaces al KMI, se vuelven estables inmediatamente y no pueden verse alteradas por cambios futuros.

Por ejemplo, un cambio que agrega un campo a una estructura utilizada por un kernel común de interfaz KMI no está permitido 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 nueva función está bien:

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 GKI, se mantiene la compatibilidad con versiones anteriores del espacio de usuario para que el kernel pueda usarse de manera segura para la versión de la plataforma Android con la que se lanzó el dispositivo. Las pruebas continuas con versiones anteriores garantizan que se mantenga la compatibilidad. Entonces, en la Figura 2, el kernel android12-5.10 se puede usar para dispositivos con Android 12 y dispositivos con Android 13. Debido a que la versión de la plataforma Android también es compatible con versiones anteriores, el kernel android12-5.4 se puede usar para dispositivos con Android 13, ya sea para iniciar o actualizar.

Al ingresar a la fase congelada, la rama se etiqueta con la cadena de versión de KMI que contiene el número de generación de KMI. Por ejemplo, cuando se congeló android11-5.4 , se etiquetó con la cadena de versión de KMI 5.4-android11-0 , donde el 0 final es el número de generación de KMI. Si hay un problema de seguridad u otro evento que requiere que se acepte un parche de cambio de KMI, se incrementa el número de generación de KMI y se vuelve a etiquetar la rama. Por ejemplo, si se acepta dicho cambio en android11-5.4 , la rama se etiquetará con la nueva versión de KMI, 5.4-android11-1 . La generación actual de KMI se puede encontrar usando el comando uname :

$ uname -r
5.4.61-android11-0-00153-ga972f59040e4

El número posterior al lanzamiento de la plataforma es la generación de KMI (0 en este caso).

Si la generación de KMI cambia, 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 reconstruirse y actualizarse sincrónicamente con el kernel. Se espera que los cambios de generación de KMI sean muy raros.

Compatibilidad entre núcleos

Los requisitos de compatibilidad entre núcleos de la misma familia LTS están cambiando a partir de los nuevos núcleos GKI.

Núcleos GKI

Los kernels de GKI mantienen la compatibilidad con todas las versiones de la plataforma Android que admitan la versión del kernel. Además, las versiones de la plataforma Android son compatibles con versiones anteriores de los kernels GKI de versiones anteriores. Por lo tanto, puede utilizar de forma segura el kernel android12-5.4 desarrollado para Android 12 en dispositivos que ejecutan Android 13. La compatibilidad se verifica mediante pruebas continuas VTS y CTS de los kernels GKI con todas las versiones compatibles.

El KMI es estable, por lo que el kernel se puede actualizar sin necesidad de reconstruir los módulos del kernel en la imagen del proveedor.

La compatibilidad KMI no se mantiene entre diferentes kernels GKI. Entonces, por ejemplo, un android12-5.10 no se puede reemplazar con un kernel android13-5.10 sin reconstruir 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 android13-5.10 no es compatible con dispositivos con Android 12.

Núcleos heredados

Los kernels de postre heredados ( *-q y *-stable ) no son compatibles con versiones anteriores en todas las versiones de la plataforma Android, pero los kernels de las dos versiones anteriores de la plataforma Android son compatibles con la actualización. Por lo tanto, un dispositivo lanzado con Android 10 usando un kernel basado en android-4.19-q puede continuar usando el kernel android-4.19-q al actualizar a Android 2020 o actualizar el código específico del proveedor para admitir android-4.19-stable .

Matriz de compatibilidad

Esta tabla muestra las versiones del kernel admitidas y probadas con cada versión de la plataforma Android.

Lanzamiento de la plataforma Android Kernels compatibles para actualización Kernels compatibles para su lanzamiento
Androide 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
android-4.14-stable
android14-6.1
android14-5.15
android13-5.15
android13-5.10
android12-5.10
Androide 13 (2022) android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)
android13-5.15
android13-5.10
android12-5.10
android12-5.4
android11-5.4
Androide 12 (2021) android12-5.10
android12-5.4
android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.19-stable
android11-5.4
android12-5.4
android12-5.10
Androide 11 (2020) android11-5.4
android-4.19-stable
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.14-p (EOL)
android-4.9-q (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android11-5.4
android-4.19-stable
android-4.14-stable
Android 10 (2019) android-4.14-stable
android-4.14-p (EOL)
android-4.9-p (EOL)
android-4.9-o (EOL)
android-4.4-p (EOL)
android-4.4-o (EOL)
android-3.18 (EOL)
android-4.14-stable
android-4.19-q (EOL)
android-4.14-q (EOL)
android-4.9-q (EOL)

Soporte de por vida y parches de seguridad

Los kernels comunes de Android son compatibles hasta que el kernel LTS asociado o la versión de la plataforma Android ya no sean compatibles. Si bien un kernel es compatible, continúa recibiendo fusiones LTS desde el nivel superior y correcciones de errores para el código específico de Android. Estas correcciones incluyen todos los parches de seguridad del kernel citados en los boletines de seguridad mensuales de Android que son relevantes para los kernels comunes de Android.

Los socios pueden estar seguros de que al fusionar periódicamente los kernels comunes de Android, obtendrán todos los parches de seguridad del kernel posibles.

Pruebas de kernel comunes

Los núcleos comunes se prueban con varios sistemas de CI además de las pruebas posteriores realizadas por los proveedores.

Prueba funcional del kernel de Linux

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

Pruebas de KernelCI

Las pruebas de compilación y arranque de KernelCI se inician cada vez que se envía un nuevo parche a una rama común del kernel. Se prueban y arrancan varios cientos de configuraciones de compilación en varias placas. Los resultados recientes para los kernels de Android se pueden encontrar aquí .

Pruebas previas y posteriores al envío de Android

Las pruebas de envío previo se utilizan para evitar que se introduzcan fallas en los núcleos comunes de Android. El resumen de los resultados de la prueba se puede encontrar en la pestaña 'Comprobaciones' del cambio de código en el kernel común de Android.

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

Las pruebas definidas por el mapeo de pruebas con el grupo de pruebas kernel-presubmit en el árbol de fuentes de la plataforma Android se ejecutarán como preenvío 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 previa al registro del código del kernel común de Android.

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

prueba de 0 días

La prueba de día 0 realiza pruebas parche por parche en todas las ramas comunes del kernel de Android cuando se envían nuevos parches. Se ejecutan varias pruebas de arranque, funcionales y de rendimiento. Únase al grupo público cros-kernel-buildreports

Matriz de prueba

Kernel común de Android Lanzamientos de la plataforma Android Conjuntos de pruebas
Principal 14 13 12 11 10 LKFT KernelCI Envío previo Publicar Enviar 0 días
android-mainline
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
android-4.19-stable
android-4.14-stable

Contribuir a los kernels comunes de Android

Generalmente, el desarrollo de funciones debe realizarse en Linux principal y no en kernels comunes de Android. Se recomienda encarecidamente el desarrollo ascendente y, una vez que se acepta el desarrollo allí, se puede realizar fácilmente un backport a la rama ACK específica según sea necesario. El equipo del kernel de Android se complace en apoyar los esfuerzos de mejora en beneficio del ecosistema de Android.

Envíe parches a Gerrit y cumpla con estas pautas de contribución .