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 envía en formato binario, y los módulos cargables por el proveedor se compilan en un árbol separado. El kernel de GKI resultante y los módulos de proveedor deben funcionar como si se hubieran compilado juntos.
En general, la comunidad de Linux no está de acuerdo con la noción de estabilidad de ABI en el kernel para el kernel de línea principal. Ante 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 de GKI con muchas restricciones con estas limitaciones:
Solo se puede usar una sola configuración,
gki_defconfig
, para compilar el kernel.El KMI solo es estable dentro de la misma versión LTS y de Android de un kernel, como
android13-5.10
,android12-5.10
oandroid13-5.15
.- No se mantiene la estabilidad de KMI para
android-mainline
.
- No se mantiene la estabilidad de KMI para
Solo se usa la cadena de herramientas específica de Clang que se proporciona en AOSP y se define para la rama correspondiente para compilar el kernel y los módulos.
Solo los símbolos que se sabe que usan los módulos, como se especifica en una lista de símbolos, se supervisan en busca de estabilidad y se consideran símbolos de KMI.
- Como consecuencia, los módulos de proveedores solo deben usar símbolos de KMI. Esta restricción se aplica mediante cargas de módulos fallidas si se requieren símbolos que no sean de KMI.
Después de que se inmoviliza la rama de KMI, se permiten los cambios, pero no pueden dañar el KMI. Entre estos cambios, se incluyen los siguientes:
- 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 un KMI estable, ya que hace que los manifiestos de repo
en kernel/manifest
describan por completo el entorno de compilación. Por ejemplo, el manifiesto para android13-5.15
incluye la cadena de herramientas, las secuencias de comandos de compilación y todo lo demás necesario para compilar el kernel de la imagen genérica del kernel (GKI). Los archivos de configuración build.config
correspondientes, como la configuración de compilación de GKI build.config.gki.aarch64
, garantizan 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, abi_gki_aarch64.xml
para android13-5.15
) o 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 de 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 de proveedores debe generar la misma ABI que la cadena de herramientas de LLVM del AOSP, y los socios deben asegurarse de que KMI sea compatible con el kernel de GKI. Te recomendamos que uses las herramientas de compilación proporcionadas, ya que proporcionan la mejor compatibilidad.
¿Qué sigue?
Si quieres obtener instrucciones para compilar el kernel mediante el proceso de compilación hermético y la cadena de herramientas de LLVM, consulta Cómo compilar kernels.
Si deseas obtener instrucciones para supervisar la ABI y solucionar problemas, consulta Supervisión de ABI de kernel de Android.