Mantener una interfaz de módulo kernel (KMI) estable

Es fundamental mantener una KMI estable para los módulos de proveedores. El kernel de GKI se construye y se envía en formato binario y los módulos cargables por el proveedor se construyen en un árbol separado. El kernel GKI resultante y los módulos del proveedor deben funcionar como si hubieran sido creados juntos.

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

  • Sólo se puede utilizar una única configuración, gki_defconfig , para construir el kernel.

  • El KMI solo es estable dentro de la misma versión LTS y Android de un kernel, como android13-5.10 , android12-5.10 o android13-5.15 .

    • No se mantiene ninguna estabilidad de KMI para android-mainline .
  • Sólo la cadena de herramientas Clang específica proporcionada en AOSP y definida para la rama correspondiente se utiliza para construir el kernel y los módulos.

  • Solo se supervisa la estabilidad de los símbolos que se sabe que utilizan los módulos, según se especifica en una lista de símbolos, y se consideran símbolos KMI.

    • El corolario es que los módulos de proveedores deben utilizar únicamente símbolos KMI. Esta restricción se aplica mediante cargas de módulo fallidas si se requieren símbolos que no sean KMI.
  • Una vez congelada la rama KMI, se permiten cambios, pero no pueden alterar el KMI. Estos cambios incluyen lo siguiente:

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

Utilice el proceso de construcción hermético y la cadena de herramientas LLVM

El proceso de compilación hermético garantiza un KMI estable al hacer que los manifiestos repo en kernel/manifest describan completamente el entorno de compilación. Por ejemplo, el manifiesto para android13-5.15 incluye la cadena de herramientas, scripts de compilación y todo lo demás necesario para compilar el kernel de imagen de kernel genérico (GKI). Los respectivos archivos de configuración build.config , como la configuración de compilación de GKI build.config.gki.aarch64 , garantizan que las herramientas incluidas se utilicen correctamente para generar resultados de compilación consistentes.

El uso de un proceso de construcción hermético también garantiza que la descripción ABI para el árbol sea coherente, ya sea generada por Google (por ejemplo, abi_gki_aarch64.xml para android13-5.15 o generada en un árbol local que incluye los módulos del proveedor). Las herramientas para crear y comparar el La descripción de ABI para la interfaz del módulo kernel (KMI) también se proporciona como parte del repositorio descrito en el manifiesto.

La cadena de herramientas utilizada para construir el kernel GKI debe ser completamente compatible con la cadena de herramientas utilizada para construir los módulos del proveedor. A partir de Android 10, todos los kernels de Android deben compilarse con una cadena de herramientas LLVM. Con GKI, la cadena de herramientas LLVM utilizada para crear núcleos de productos y módulos de proveedores debe generar la misma ABI que la cadena de herramientas LLVM de AOSP y los socios deben asegurarse de que el KMI sea compatible con el kernel de GKI. Se recomienda encarecidamente el uso de las herramientas de compilación proporcionadas, ya que brindan garantías de compatibilidad.

¿Que sigue?