Es fundamental mantener una interfaz de módulo del 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 cargables por el 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 desaprueba la idea de la estabilidad de la ABI en el kernel para el kernel principal. Ante las diferentes cadenas de herramientas, configuraciones y un kernel de Linux de línea principal en constante evolución, no es factible mantener una KMI estable en la línea principal. Sin embargo, es posible mantener un KMI estable en el entorno de GKI altamente restringido con estas limitaciones:
Solo se puede usar una configuración,
gki_defconfig
, para compilar el kernel.El KMI solo es estable dentro de la misma versión de LTS y de Android de un kernel, como
android14-6.1
,android15-6.6
oandroid16-6.12
.- No se mantiene la estabilidad de la KMI para
android-mainline
.
- No se mantiene la estabilidad de la KMI para
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 supervisa la estabilidad de los símbolos que se sabe que usan los módulos, según se especifica en una lista de símbolos, 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 cuando fallan las cargas de módulos si se requieren símbolos que no son de KMI.
Después de que se congela la rama del KMI, se permiten los cambios, pero no se puede interrumpir 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 las actualizaciones)
Usa el proceso de compilación hermética y la cadena de herramientas de LLVM
El proceso de compilación hermética garantiza una KMI estable, ya que los manifiestos de repo
en kernel/manifest
describen por completo el entorno de compilación. Por ejemplo, el manifiesto para 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.
Usar 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 del módulo del kernel (KMI) también se proporcionan como parte del repo 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 el GKI, la cadena de herramientas de LLVM que se usa para compilar kernels de productos y módulos de proveedores debe generar la misma ABI que la cadena de herramientas de LLVM del AOSP, y los socios deben asegurarse de que la KMI sea compatible con el kernel del GKI. Se recomienda usar 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 corregir problemas, consulta Supervisión de ABI de kernel de Android.