Proyecto de imagen genérica de kernel (GKI)

Un kernel de producto, también conocido como kernel de dispositivo o kernel de OEM, es el kernel que envías a tu dispositivo. Antes de GKI, el kernel del producto se derivaba de una serie de cambios de kernel ascendentes. En la Figura 1, se muestra cómo las incorporaciones del kernel generan un kernel de producto (kernel del OEM o del dispositivo):

Construcción del kernel del producto anterior a GKI

Figura 1: Construcción del kernel del producto anterior a GKI

  1. El kernel Linux con asistencia a largo plazo (LTS) de kernel.org se modificó con parches específicos de Android, lo que generó un kernel común de Android (ACK).
  2. Los proveedores que agregaron compatibilidad con su sistema en chip (SoC) modificaron el ACK. Los proveedores también pueden agregar optimizaciones de rendimiento o energía. El kernel resultante se denomina kernel del proveedor.
  3. Por último, los OEMs modificaron aún más el kernel del proveedor con controladores de dispositivos y personalizaciones adicionales que consideraron necesarios. El kernel resultante se denomina kernel del producto.

Todas estas modificaciones pueden hacer que hasta el 50% del código del kernel quede fuera del código del árbol y no de ACK o kernels ascendentes de Linux. Antes de GKI, casi todos los dispositivos tenían un kernel personalizado que generaba fragmentación.

Costos de la fragmentación

La fragmentación del kernel tiene varios efectos negativos en la comunidad de Android.

Las actualizaciones de seguridad requieren mucho trabajo

Los parches de seguridad que se mencionan en el boletín de seguridad de Android (ASB) deben portarse a cada uno de los kernels del dispositivo. Sin embargo, debido a la fragmentación del kernel, es prohibitivamente costoso propagar correcciones de seguridad a los dispositivos Android en el campo.

Es difícil combinar las actualizaciones compatibles a largo plazo.

Las versiones con asistencia a largo plazo (LTS) incluyen correcciones de seguridad y otras correcciones de errores críticas. Estar al día con las versiones de LTS demostró ser la forma más eficaz de proporcionar correcciones de seguridad. En los dispositivos Pixel, se descubrió que el 90% de los problemas de seguridad del kernel informados en el ASB ya se habían solucionado en los dispositivos que se mantienen actualizados.

Sin embargo, con todas las modificaciones personalizadas en los kernels del dispositivo, es difícil combinar las correcciones de LTS en los kernels del dispositivo.

Inhibe las actualizaciones de versiones de la plataforma de Android

La fragmentación dificulta que se agreguen funciones nuevas de Android que requieran cambios en el kernel a los dispositivos en el campo. En el código de Android Framework, se debe suponer que se admiten hasta cinco versiones de kernel y que no se realizaron cambios en la nueva plataforma (Android 10 admite kernels 3.18, 4.4, 4.9, 4.14 y 4.19, que en algunos casos no se mejoraron con funciones nuevas desde Android 8 en 2017).

Es difícil contribuir con cambios del kernel a Linux upstream.

Con todos los cambios que se realizan en el kernel, la mayoría de los dispositivos insignia se envían con una versión del kernel que ya tiene al menos 18 meses. Por ejemplo, kernel.org lanzó el kernel 4.14 en noviembre de 2017, y los primeros teléfonos Android que usaban kernels 4.14 se enviaron en la primavera de 2019.

Esta larga demora entre la versión del kernel upstream y los productos dificulta que la comunidad de Android envíe las funciones y los controladores necesarios a los kernels upstream.

Corrige la fragmentación: Imagen genérica del kernel

El proyecto de imagen genérica del kernel (GKI) aborda la fragmentación del kernel unificando el kernel principal y trasladando la compatibilidad con el SoC y la placa desde el kernel principal hacia módulos de proveedores cargables. GKI también presenta una interfaz de módulo de kernel (KMI) estable para los módulos del proveedor, de modo que los módulos y el kernel se puedan actualizar de forma independiente. Estas son algunas de las características del kernel de GKI:

  • El kernel de GKI se compila a partir de fuentes de ACK.
  • El kernel de GKI es un binario de un solo kernel más los módulos cargables asociados por arquitectura y por versión de LTS (actualmente, solo arm64 para android11-5.4 y android12-5.4).
  • El kernel de GKI se prueba con todas las versiones de la plataforma de Android que son compatibles con el ACK asociado. No hay baja de funciones durante el ciclo de vida de una versión del kernel de GKI.
  • El kernel de GKI expone un KMI estable a los controladores dentro de un LTS determinado.
  • El kernel de GKI no contiene código específico de SoC ni de placa.

Para obtener una imagen de la arquitectura de GKI, consulta la descripción general del kernel.

GKI es un cambio complejo que se lanzó en varias etapas a partir de los kernels v5.4 de la versión de la plataforma de Android 11.

Existen dos etapas de GKI:

  • GKI 1.0 se introdujo en Android 11 para dispositivos con kernels 5.4. GKI 1.0 se aplica a todos los dispositivos que se envían con kernels de 5.4, incluso a los que se lanzaron con Android 12 o Android 13.
  • GKI 2.0 se introdujo en Android 12 para dispositivos con kernels 5.10 y es el nuevo estándar para todos los dispositivos que se envían con kernels 5.10 o versiones posteriores.

GKI 1.0

En GKI 1.0, los dispositivos que se inician con la versión 5.4 del kernel deben aprobar las pruebas de GKI (Android 11 y versiones posteriores de la plataforma). Los objetivos de la GKI 1.0 incluyen los siguientes:

  • Evita las regresiones en el conjunto de pruebas de proveedores (VTS) o el conjunto de pruebas de compatibilidad (CTS) cuando reemplaces el kernel del producto por el kernel de GKI.
  • Reduce la carga del socio de mantener su kernel actualizado con kernels comunes de AOSP.
  • Incluye los cambios principales de Android en los kernels para que los dispositivos se actualicen y se inicien con nuevas versiones de Android.
  • No rompas el espacio de usuario de Android.
  • Separa los componentes específicos de hardware del kernel principal como módulos cargables.

Para obtener documentación de GKI 1.0, consulta la sección de GKI 1.0.

GKI 2.0

En GKI 2.0, los dispositivos que se lanzan con la versión de kernel 5.10 o una versión posterior deben incluir el kernel de GKI (a partir de Android 12). Las imágenes de inicio firmadas están disponibles y se actualizan regularmente con LTS y correcciones de errores críticos. Debido a que se mantiene la estabilidad binaria para el KMI, puedes instalar estas imágenes de inicio sin hacer cambios en las imágenes del proveedor. Los objetivos de GKI 2.0 incluyen los siguientes:

  • No introduzcas regresiones significativas de rendimiento o energía cuando reemplaces el kernel del producto por el kernel de GKI.
  • Permite que los socios proporcionen correcciones de seguridad y errores del kernel sin la participación del proveedor.
  • Reducir el costo de actualizar la versión principal del kernel de los dispositivos (por ejemplo, de la versión 5.10 al kernel LTS de 2021)
  • Mantén un solo binario de kernel de GKI por arquitectura actualizando las versiones del kernel con un proceso de actualización claro.

GKI 2.0 representa el estado más reciente de los kernels de Android. La documentación del kernel fuera de las sub secciones GKI 1.0 y Kerneles anteriores (<=4.19) refleja la arquitectura de GKI 2.0.