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.