El proyecto Imagen de kernel genérica (GKI)

Un kernel de producto , también conocido como kernel de dispositivo o kernel OEM , es el kernel que se incluye en su dispositivo. Antes de GKI, el núcleo del producto se derivaba de una serie de cambios en el núcleo. La Figura 1 muestra cómo las adiciones de kernel producen un kernel de producto (OEM/kernel de dispositivo):

Construcción del núcleo del producto anterior a GKI

Figura 1. Construcción del núcleo del producto anterior a GKI.

  1. El kernel de Linux con soporte a largo plazo (LTS) de kernel.org se modificó con parches específicos de Android, lo que dio como resultado un kernel común de Android (ACK) .
  2. El ACK fue modificado por proveedores que agregaron soporte para su System-on-a-Chip (SoC). Los proveedores también podrían agregar optimizaciones de rendimiento o energía. El núcleo resultante se denomina núcleo del proveedor .
  3. Finalmente, los OEM modificaron aún más el kernel del proveedor con controladores de dispositivos adicionales y personalizaciones que consideraron necesarias. El núcleo resultante se llama núcleo del producto .

Todas estas modificaciones pueden dar como resultado que hasta el 50% del código del kernel sea código fuera del árbol y no de kernels de Linux o ACK anteriores. Antes de GKI, casi todos los dispositivos tenían un kernel personalizado que provocaba su fragmentación.

Los costos de la fragmentación

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

Las actualizaciones de seguridad requieren mucha mano de obra

Los parches de seguridad citados en el Boletín de seguridad de Android (ASB) deben incluirse en cada uno de los núcleos del dispositivo. Sin embargo, debido a la fragmentación del kernel, es prohibitivamente costoso propagar correcciones de seguridad a dispositivos Android en el campo.

Es difícil fusionar actualizaciones compatibles a largo plazo

Las versiones con soporte a largo plazo (LTS) incluyen correcciones de seguridad y otras correcciones de errores críticos. Mantenerse actualizado con las versiones de LTS ha demostrado 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 ASB ya se habían solucionado para los dispositivos que se mantienen actualizados.

Sin embargo, con todas las modificaciones personalizadas en los núcleos del dispositivo, es difícil simplemente fusionar las correcciones LTS en los núcleos del dispositivo.

Inhibe las actualizaciones de lanzamiento de la plataforma Android

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

Es difícil contribuir con cambios del kernel a Linux

Con todos los cambios realizados en el kernel, la mayoría de los dispositivos emblemáticos 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 usaron kernels 4.14 se enviaron en la primavera de 2019.

Este largo retraso entre el lanzamiento del kernel ascendente y los productos dificulta que la comunidad de Android introduzca las funciones y controladores necesarios en los kernels ascendentes.

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

El proyecto Generic Kernel Image (GKI) aborda la fragmentación del kernel unificando el kernel central y trasladando el soporte de SoC y placa del kernel central a módulos de proveedor cargables. GKI también presenta una interfaz de módulo de kernel (KMI) estable para módulos de proveedores, de modo que los módulos y el kernel se pueden actualizar de forma independiente. Algunas características del kernel GKI son:

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

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

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

Actualmente hay dos etapas de GKI:

  • GKI 1.0 se introdujo en Android 11 para dispositivos con kernel 5.4. GKI 1.0 se aplica a todos los dispositivos enviados con kernels 5.4, incluso aquellos lanzados 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 posteriores.

GKI 1.0

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

  • Evite regresiones en Vendor Test Suite (VTS) o Compatibility Test Suite (CTS) al reemplazar el kernel del producto con el kernel GKI.
  • Reduzca la carga de los socios de mantener su kernel actualizado con kernels comunes de AOSP.
  • Incluya cambios principales de Android en los kernels para dispositivos que se actualizan y lanzan con nuevas versiones de Android.
  • No rompas el espacio de usuario de Android.
  • Separe los componentes específicos del hardware del núcleo central como módulos cargables.

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

GKI 2.0

En GKI 2.0, los dispositivos que se inician con la versión del kernel 5.10 o superior deben venir con el kernel GKI (a partir de Android 12). Las imágenes de arranque firmadas están disponibles y se actualizan periódicamente con LTS y correcciones de errores críticos. Debido a que se mantiene la estabilidad binaria para KMI, puede instalar estas imágenes de arranque sin realizar cambios en las imágenes del proveedor. Los objetivos de GKI 2.0 incluyen los siguientes:

  • No introduzca regresiones significativas de rendimiento o potencia al reemplazar el kernel del producto con el kernel GKI.
  • Permita que los socios proporcionen correcciones de seguridad del kernel y correcciones de errores sin la participación del proveedor.
  • Reduzca el costo de actualizar la versión principal del kernel para dispositivos (por ejemplo, de v5.10 al kernel LTS 2021).
  • Mantenga un único binario del kernel GKI por arquitectura actualizando las versiones del kernel con un proceso claro de actualización.

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