En esta página, se describe cómo compilar representaciones de ABI del kernel de Android y ejecutar la supervisión de la ABI. Se aplica a Android 16 y versiones posteriores. Para versiones anteriores, consulta Cómo supervisar versiones anteriores del kernel con ABI.
Consulta también la documentación de referencia de Kleaf: Admite la supervisión de ABI (GKI) y Admite la supervisión de ABI (dispositivo).
Compila el kernel y su representación de ABI
Después de descargar las fuentes de GKI, ejecuta el siguiente comando para compilar el kernel de GKI y los artefactos de ABI:
tools/bazel run //common:kernel_aarch64_abi_dist
Este comando compila la representación actual de la ABI y la copia en $DIST_DIR/abi.stg
junto con el kernel y los módulos compilados. La configuración predeterminada de $DIST_DIR
es out_abi/kernel_aarch64_abi_dist/dist
.
Puedes especificar argumentos adicionales para las herramientas de ABI al final del comando después de --
. Por ejemplo, para cambiar el destino de la ABI y compilar artefactos, puedes usar la opción --dist_dir
:
tools/bazel run //common:kernel_aarch64_abi_dist -- --dist_dir=out/dist
Analiza las diferencias de ABI entre la compilación y una representación de referencia
El objetivo //common:kernel_aarch64_abi_dist
, que se ejecuta en el comando anterior, analiza e informa cualquier diferencia de ABI que se encuentre entre la compilación y la representación de referencia ubicada en common/gki/aarch64/abi.stg
(definida en BUILD.bazel
). Estas diferencias se imprimen al final de la compilación, como se muestra en el siguiente ejemplo:
INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!
El informe impreso proviene del artefacto de compilación ubicado en $DIST_DIR/abi_stgdiff/abi.report.short
junto con informes en otros formatos.
La automatización debe usar el código de salida del comando de compilación, que no es cero si se encuentran diferencias.
Ten en cuenta que las ramas de la fase de desarrollo, incluida android-mainline
, no tienen representación de ABI de referencia.
Sin ella, //common:kernel_aarch64_abi_dist
no detectará ninguna diferencia.
Actualiza la representación de ABI de referencia
Cualquier cambio que afecte la ABI del kernel, como una actualización de la lista de símbolos, debe reflejarse en la representación de ABI de referencia (common/gki/aarch64/abi.stg
, definida en BUILD.bazel).
Para ello, debes ejecutar el siguiente comando:
tools/bazel run //common:kernel_aarch64_abi_update
Este comando realiza todo el paso Analizar las diferencias de ABI y, además, actualiza la representación de referencia en las fuentes. Luego, se puede subir la ABI actualizada en la misma confirmación que el cambio. Incluye las diferencias de ABI del informe en $DIST_DIR/abi_stgdiff/abi.report.short
en el mensaje de confirmación.
Supervisión de ABI y objetivos de dispositivos
La supervisión de ABI solo se debe configurar para los objetivos de compilación del kernel principal. Las configuraciones de compilación mixtas (las que definen base_kernel
) que se compilan directamente con el kernel de GKI solo deben agregar compatibilidad para hacer un seguimiento de la lista de símbolos del dispositivo.
La definición de ABI debe actualizarse con la compilación de GKI.
Consulta también la documentación de referencia de Kleaf: Compatibilidad con la supervisión de ABI (dispositivo).
Supervisión de ABI de versiones anteriores del kernel (Android 15 y versiones anteriores)
En el caso de las versiones anteriores del kernel, las instrucciones de compilación y supervisión de ABI difieren de la siguiente manera.
Android 15 y 14
Las instrucciones son, en su mayoría, las mismas que las de Android 16, excepto que la representación de ABI de referencia es common/android/abi_gki_aarch64.stg
y $DIST_DIR
se establece de forma predeterminada en out_abi/kernel_aarch64/dist
.
Android 13
Android 13 se puede compilar con Kleaf o con secuencias de comandos de compilación heredadas.
Para Kleaf, las instrucciones son las mismas que para Android 14, excepto que el formato de la ABI es XML y la representación de la ABI de referencia es common/android/abi_gki_aarch64.xml
.
En el caso de las secuencias de comandos de compilación heredadas, las instrucciones son las mismas que para Android 12.
Android 12 y versiones anteriores
El formato de ABI es XML y la representación de ABI de referencia es common/android/abi_gki_aarch64.xml
.
Estos kernels usan build.sh
en lugar de Kleaf. Para la supervisión de ABI, debes usar build_abi.sh
, que acepta las mismas variables de entorno para personalizar la compilación como build.sh
. Por ejemplo:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh
Esto compila el kernel y extrae la representación de ABI en el subdirectorio OUT_DIR
(que es out_abi
de forma predeterminada) y es equivalente al objetivo //common:kernel_aarch64_abi_dist
de Kleaf (consulta Cómo compilar artefactos de kernel y ABI).
La representación de ABI de referencia se almacena en android/abi_gki_aarch64.xml
como
lo define la variable ABI_DEFINITION
en common/build.config.gki.aarch64
.
Si necesitas actualizar la representación de la ABI del kernel, la forma más conveniente es usar las opciones --update
y --print-report
:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report
--print-report
imprime las diferencias de ABI entre el archivo tal como existe y una ABI generada recientemente.
La opción --update
anula la representación de ABI de referencia. También realiza la actualización de la lista de símbolos cuando se usa BUILD_CONFIG
para un dispositivo con KMI_SYMBOL_LIST
configurado.