En esta página, se describe cómo compilar representaciones de la 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 ABI monitor previous kernel versions.
Consulta también la documentación de referencia de Kleaf: Support ABI monitoring (GKI) y Support ABI monitoring (Device).
Compila el kernel y su representación de ABI
Después de descargar las fuentes del GKI, ejecuta el siguiente comando para compilar el kernel del 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. El valor predeterminado 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 los artefactos de ABI y compilación, puedes usar la opción --destdir
:
tools/bazel run //common:kernel_aarch64_abi_dist -- --destdir=out/dist
Analiza las diferencias de ABI entre la compilación y una representación de referencia
El destino //common:kernel_aarch64_abi_dist
, que se ejecuta en el comando anterior, analiza y registra 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 una representación de ABI de referencia.
Sin ella, //common:kernel_aarch64_abi_dist
no detectará ninguna diferencia.
Actualiza la representación de la 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 la 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 todas las acciones del paso Analiza las diferencias de la 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 la ABI y segmentación por dispositivos
La supervisión de ABI solo debe configurarse 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 necesitan 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 del GKI.
Consulta también la documentación de referencia de Kleaf: Support ABI monitoring (Device).
Supervisar la ABI de versiones anteriores del kernel (Android 15 y versiones anteriores)
En el caso de las versiones anteriores del kernel, las instrucciones de supervisión y compilación de la ABI difieren de la siguiente manera.
Android 15 y 14
Las instrucciones son casi las mismas que para Android 16, excepto que la representación de la 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.
En el caso de Kleaf, las instrucciones son las mismas que para Android 14, excepto que el formato de ABI es XML y la representación de 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 la ABI es XML y la representación de la ABI de referencia es common/android/abi_gki_aarch64.xml
.
Estos kernels usan build.sh
en lugar de Kleaf. Para el monitoreo de ABI, debes usar build_abi.sh
, que acepta las mismas variables de entorno para personalizar la compilación que 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 la 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 Compila artefactos de kernel y ABI).
La representación de ABI de referencia se almacena en android/abi_gki_aarch64.xml
según 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
El comando --print-report
imprime las diferencias de ABI entre el archivo tal como existe y una ABI recién generada.
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.