Mantén una interfaz de módulo de kernel estable

Es fundamental mantener una interfaz de módulo de kernel (KMI) estable para los módulos del proveedor. El kernel de GKI se compila y se envía en formato binario, y los módulos que se pueden cargar del proveedor se compilan en un árbol separado. El kernel de GKI y los módulos del proveedor resultantes deben funcionar como si se hubieran compilado juntos.

En general, la comunidad de Linux ha desaprobado la noción de estabilidad de la ABI de kernel para el kernel principal. Ante las diferentes cadenas de herramientas, configuraciones y un kernel principal de Linux en constante evolución, no es posible mantener una KMI estable en el kernel principal. Sin embargo, es posible mantener una KMI estable en el entorno de GKI altamente restringido con estas restricciones:

  • Solo se puede usar una sola configuración, gki_defconfig, para compilar el kernel.

  • La KMI solo es estable dentro de la misma versión de LTS y Android de un kernel, como android14-6.1, android15-6.6 o android16-6.12.

    • No se mantiene la estabilidad de la KMI para android-mainline.
  • Solo se usa la cadena de herramientas Clang específica que se proporciona en AOSP y se define para la rama correspondiente para compilar el kernel y los módulos.

  • Solo se supervisan los símbolos que se sabe que usan los módulos, como se especifica en una lista de símbolos, para determinar su estabilidad y se consideran símbolos de KMI.

    • La consecuencia es que los módulos del proveedor solo deben usar símbolos de KMI. Esta restricción se aplica si fallan las cargas de módulos si se requieren símbolos que no son de KMI.
  • Una vez que se congela la rama de KMI, se permiten los cambios, pero no pueden interrumpir la KMI. Estos cambios incluyen lo siguiente:

    • Cambios de configuración
    • Cambios en el código del kernel
    • Cambios en la cadena de herramientas (incluidas las actualizaciones)

Usa el proceso de compilación hermético y la cadena de herramientas de LLVM

El proceso de compilación hermético garantiza una KMI estable, ya que los manifiestos repo en kernel/manifest describen por completo el entorno de compilación. Por ejemplo, el manifiesto de android16-6.12 incluye la cadena de herramientas, el sistema de compilación y todo lo demás que se requiere para compilar el kernel de la imagen genérica del kernel (GKI). La configuración de compilación, principalmente BUILD.bazel, garantiza que las herramientas incluidas se usen correctamente para generar resultados de compilación coherentes.

El uso de un proceso de compilación hermético también garantiza que la descripción de la ABI del árbol sea coherente, ya sea que la genere Google (por ejemplo, gki/aarch64/abi.stg para android16-6.12) o que se genere en un árbol local que incluya los módulos del proveedor. Las herramientas para crear y comparar la descripción de la ABI para la interfaz de módulo de kernel (KMI) también se proporcionan como parte del repositorio que describe el manifiesto.

La cadena de herramientas que se usa para compilar el kernel de GKI debe ser completamente compatible con la cadena de herramientas que se usa para compilar los módulos del proveedor. A partir de Android 10, todos los kernels de Android deben compilarse con una cadena de herramientas de LLVM. Con GKI, la cadena de herramientas de LLVM que se usa para compilar kernels de productos y módulos del proveedor debe generar la misma ABI que la cadena de herramientas de LLVM de AOSP, y los socios deben asegurarse de que la KMI sea compatible con el kernel de GKI. Te recomendamos que uses las herramientas de compilación proporcionadas, ya que ofrecen la mejor compatibilidad.

Próximos pasos

  • Para obtener instrucciones sobre cómo compilar el kernel con el proceso de compilación hermético y la cadena de herramientas de LLVM, consulta Compila kernels.

  • Para obtener instrucciones sobre cómo supervisar la ABI y solucionar problemas, consulta Supervisión de ABI de kernel de Android