Exécuter la surveillance des ABI

Cette page explique comment créer des représentations ABI du kernel Android et exécuter la surveillance ABI. Il s'applique à Android 16 et versions ultérieures. Pour les versions antérieures, consultez Surveillance de l'ABI des versions de kernel précédentes.

Consultez également la documentation de référence de Kleaf : Prise en charge de la surveillance des ABI (GKI) et Prise en charge de la surveillance des ABI (appareil).

Compiler le noyau et sa représentation ABI

Après avoir téléchargé les sources GKI, exécutez la commande suivante pour créer le noyau GKI et les artefacts ABI:

tools/bazel run //common:kernel_aarch64_abi_dist

Cette commande crée la représentation ABI actuelle et la copie dans $DIST_DIR/abi.stg, ainsi que le noyau et les modules compilés. $DIST_DIR a la valeur par défaut out_abi/kernel_aarch64_abi_dist/dist.

Vous pouvez spécifier des arguments supplémentaires pour les outils ABI à la fin de la commande après --. Par exemple, pour modifier la destination de l'ABI et des artefacts de compilation, vous pouvez utiliser l'option --dist_dir:

tools/bazel run //common:kernel_aarch64_abi_dist -- --dist_dir=out/dist

Analyser les différences d'ABI entre le build et une représentation de référence

La cible //common:kernel_aarch64_abi_dist, exécutée dans la commande précédente, analyse et signale toute différence ABI détectée entre la compilation et la représentation de référence située à common/gki/aarch64/abi.stg (définie dans BUILD.bazel). Ces différences sont imprimées à la fin de la compilation, comme illustré dans l'exemple suivant:

INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!

Le rapport imprimé provient de l'artefact de compilation situé dans $DIST_DIR/abi_stgdiff/abi.report.short, ainsi que des rapports dans d'autres formats.

L'automatisation doit utiliser le code de sortie de la commande de compilation, qui est différent de zéro si des différences sont détectées.

Notez que les branches de la phase de développement, y compris android-mainline, n'ont aucune représentation ABI de référence. Sans cela, //common:kernel_aarch64_abi_dist ne détectera aucune différence.

Mettre à jour la représentation de l'ABI de référence

Tout changement affectant l'ABI du noyau, comme une mise à jour de la liste des symboles, doit être reflété dans la représentation de l'ABI de référence (common/gki/aarch64/abi.stg, définie dans BUILD.bazel). Pour ce faire, exécutez la commande suivante:

tools/bazel run //common:kernel_aarch64_abi_update

Cette commande effectue tout ce qui est indiqué dans l'étape Analyser les différences ABI et met également à jour la représentation de référence dans les sources. L'ABI mis à jour peut ensuite être importé dans le même commit que le changement. Incluez les différences ABI du rapport dans $DIST_DIR/abi_stgdiff/abi.report.short dans le message de commit.

Surveillance de l'ABI et cibles d'appareils

La surveillance ABI ne doit être configurée que pour les cibles de compilation du noyau principal. Les configurations de compilation mixtes (celles qui définissent base_kernel) qui compilent directement avec le noyau GKI ne doivent ajouter la prise en charge du suivi de la liste des symboles de l'appareil que. La définition de l'ABI doit être mise à jour à l'aide du build GKI.

Consultez également la documentation de référence de Kleaf : Prise en charge de la surveillance ABI (appareil).

Moniteur ABI des versions de kernel précédentes (Android 15 et versions antérieures)

Pour les versions précédentes du kernel, les instructions de compilation et de surveillance de l'ABI sont différentes comme suit.

Android 15 et 14

Les instructions sont essentiellement les mêmes que pour Android 16, sauf que la représentation ABI de référence est common/android/abi_gki_aarch64.stg et que $DIST_DIR est défini par défaut sur out_abi/kernel_aarch64/dist.

Android 13

Android 13 peut être compilé avec Kleaf ou avec d'anciens scripts de compilation.

Pour Kleaf, les instructions sont les mêmes que pour Android 14, à l'exception du format ABI au format XML et de la représentation ABI de référence common/android/abi_gki_aarch64.xml.

Pour les anciens scripts de compilation, les instructions sont les mêmes qu'avec Android 12.

Android 12 ou version antérieure

Le format ABI est XML, et la représentation ABI de référence est common/android/abi_gki_aarch64.xml.

Ces noyaux utilisent build.sh au lieu de Kleaf. Pour la surveillance de l'ABI, vous devez utiliser build_abi.sh, qui accepte les mêmes variables d'environnement pour personnaliser le build que build.sh. Exemple :

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh

Cela permet de créer le noyau et d'extraire la représentation ABI dans le sous-répertoire OUT_DIR (qui est out_abi par défaut) et équivaut à la cible //common:kernel_aarch64_abi_dist de Kleaf (voir Créer des artefacts de noyau et d'ABI).

La représentation ABI de référence est stockée dans android/abi_gki_aarch64.xml, comme défini par la variable ABI_DEFINITION dans common/build.config.gki.aarch64.

Si vous devez mettre à jour la représentation de l'ABI du kernel, le moyen le plus pratique consiste à utiliser les options --update et --print-report:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report

--print-report affiche les différences d'ABI entre le fichier tel qu'il existe et un ABI nouvellement généré.

L'option --update écrase la représentation ABI de référence. Il effectue également la mise à jour de la liste des symboles lorsque vous utilisez BUILD_CONFIG pour un appareil avec KMI_SYMBOL_LIST configuré.