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

Es fundamental mantener un KMI estable para los módulos de proveedores. El kernel de GKI se crea y se envía en forma binaria y los módulos cargables por el proveedor se crean en un árbol separado. El kernel de GKI resultante y los módulos del proveedor deben funcionar como si se hubieran creado juntos.

En general, la comunidad de 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 de línea 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:

  • Solo se puede usar una única configuración, gki_defconfig , para compilar 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 la estabilidad de KMI para android-mainline .
  • Solo la cadena de herramientas de Clang específica proporcionada en AOSP y definida para la rama correspondiente se usa 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, tal como se especifica en una lista de símbolos, y se consideran símbolos KMI.

    • El corolario es que los módulos de proveedores deben usar solo símbolos KMI. Esta restricción se aplica al fallar las cargas del módulo si se requieren símbolos que no sean KMI.
  • Después de congelar la rama de KMI, se permiten cambios pero no pueden romper el KMI. Estos cambios incluyen lo siguiente:

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

Use 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 tener manifiestos repo en kernel/manifest que describen completamente el entorno de compilación. Por ejemplo, el manifiesto para android13-5.15 incluye la cadena de herramientas, los scripts de compilación y todo lo demás necesario para compilar el kernel de la imagen genérica del kernel (GKI). Los respectivos archivos de configuración build.config , como GKI build config build.config.gki.aarch64 , aseguran que las herramientas incluidas se utilicen correctamente para generar resultados de compilación consistentes.

El uso de un proceso de compilación hermético también garantiza que la descripción ABI para el árbol sea coherente, ya sea que la genere Google (por ejemplo, abi_gki_aarch64.xml para android13-5.15 o que se genere 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 del kernel (KMI) también se proporciona como parte del repositorio descrito por el manifiesto.

La cadena de herramientas utilizada para crear el kernel de GKI debe ser completamente compatible con la cadena de herramientas utilizada para crear módulos de proveedores. 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 kernels 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 la KMI sea compatible con el kernel GKI. Se recomienda encarecidamente el uso de las herramientas de compilación proporcionadas, ya que proporcionan las garantías de compatibilidad.

¿Que sigue?