Cómo ejecutar la supervisión de ABI

En esta página, se describe cómo compilar representaciones de ABI de kernel de Android y ejecutar la supervisión de ABI. Se aplica a Android 14 y versiones posteriores. Para versiones anteriores, consulta Versiones anteriores del kernel.

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 out_abi/kernel_aarch64/dist/abi.stg junto con el kernel y los módulos compilados.

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 y, luego, informa las diferencias de ABI que se encuentran entre la compilación y la representación de referencia ubicada en common/android/abi_gki_aarch64.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 out_abi/kernel_aarch64/dist/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 él, //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/android/abi_gki_aarch64.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.report.short en el mensaje de confirmación.

Supervisión de ABI y objetivos de 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 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).

Versiones anteriores del kernel

Android 13

Las instrucciones de compilación son, en su mayoría, las mismas que en 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.

Android 13 y versiones anteriores

Al igual que en Android 13, el formato de ABI es XML.

Los kernels más antiguos 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 según lo define la variable ABI_DEFINITION en common/build.config.gki.aarch64.

Si necesitas actualizar la representación de ABI de kernel, la manera 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.