Esegui il monitoraggio ABI

Questa pagina descrive come creare rappresentazioni ABI del kernel di Android ed eseguire il monitoraggio dell'ABI. È applicabile ad Android 16 e versioni successive. Per le versioni precedenti, consulta Monitorare le versioni precedenti del kernel con ABI.

Consulta anche la documentazione di riferimento per Kleaf: Support ABI monitoring (GKI) e Support ABI monitoring (Device).

Crea il kernel e la relativa rappresentazione ABI

Dopo aver scaricato le sorgenti GKI, esegui il seguente comando per compilare il kernel e gli elementi ABI di GKI:

tools/bazel run //common:kernel_aarch64_abi_dist

Questo comando genera la rappresentazione ABI corrente e la copia in $DIST_DIR/abi.stg insieme al kernel e ai moduli compilati. $DIST_DIR Il valore predefinito è out_abi/kernel_aarch64_abi_dist/dist.

Puoi specificare argomenti aggiuntivi per gli strumenti ABI alla fine del comando dopo --. Ad esempio, per modificare la destinazione per gli elementi ABI e di compilazione, puoi utilizzare l'opzione --dist_dir:

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

Analizza le differenze ABI tra la build e una rappresentazione di riferimento

Il target //common:kernel_aarch64_abi_dist, eseguito nel comando precedente, analizza e segnala eventuali differenze ABI rilevate tra la build e la rappresentazione di riferimento in common/gki/aarch64/abi.stg (definita in BUILD.bazel). Queste differenze vengono stampate al termine della compilazione, come mostrato nell'esempio seguente:

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

Il report stampato proviene dall'elemento dell'assembly situato in $DIST_DIR/abi_stgdiff/abi.report.short insieme ai report in altri formati.

L'automazione deve utilizzare il codice di uscita del comando di compilazione, che non è zero se vengono rilevate differenze.

Tieni presente che i branch di fase di sviluppo, incluso android-mainline, non hanno una rappresentazione ABI di riferimento. In caso contrario, //common:kernel_aarch64_abi_dist non rileverà alcuna differenza.

Aggiorna la rappresentazione dell'ABI di riferimento

Qualsiasi modifica che influisca sull'ABI del kernel, ad esempio un aggiornamento dell'elenco di simboli, deve essere riportata nella rappresentazione dell'ABI di riferimento (common/gki/aarch64/abi.stg, definito in BUILD.bazel). Per farlo, devi eseguire il seguente comando:

tools/bazel run //common:kernel_aarch64_abi_update

Questo comando esegue tutto il passaggio Analisi delle differenze ABI e aggiorna inoltre la rappresentazione di riferimento nelle origini. L'ABI aggiornato può essere caricato nello stesso commit della modifica. Includi le differenze ABI del report in $DIST_DIR/abi_stgdiff/abi.report.short nel messaggio di commit.

Monitoraggio ABI e target dispositivo

Il monitoraggio ABI deve essere configurato solo per i target di compilazione del kernel di base. Le configurazioni di compilazione miste (quelle che definiscono base_kernel) che vengono compilate direttamente con il kernel GKI devono solo aggiungere il supporto per il monitoraggio dell'elenco di simboli del dispositivo. La definizione dell'ABI deve essere aggiornata utilizzando la compilazione GKI.

Consulta anche la documentazione di riferimento di Kleaf: Supporta il monitoraggio ABI (dispositivo).

Monitoraggio ABI delle versioni precedenti del kernel (Android 15 e versioni precedenti)

Per le versioni precedenti del kernel, le istruzioni per la compilazione e il monitoraggio dell'ABI sono diverse come segue.

Android 15 e 14

Le istruzioni sono per lo più le stesse di Android 16, tranne per il fatto che la rappresentazione dell'ABI di riferimento è common/android/abi_gki_aarch64.stg e $DIST_DIR per impostazione predefinita è out_abi/kernel_aarch64/dist.

Android 13

Android 13 può essere compilato con Kleaf o con gli script di compilazione precedenti.

Per Kleaf, le istruzioni sono le stesse di Android 14, tranne per il fatto che il formato dell'ABI è XML e la rappresentazione dell'ABI di riferimento ècommon/android/abi_gki_aarch64.xml.

Per gli script di compilazione precedenti, le istruzioni sono le stesse di Android 12.

Android 12 e versioni precedenti

Il formato ABI è XML e la rappresentazione ABI di riferimento è common/android/abi_gki_aarch64.xml

Questi kernel utilizzano build.sh anziché Kleaf. Per il monitoraggio ABI, devi utilizzare build_abi.sh, che accetta le stesse variabili di ambiente per personalizzare la compilazione di build.sh. Ad esempio:

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

Questo compila il kernel ed estrae la rappresentazione ABI nella sottodirectory OUT_DIR (che è out_abi per impostazione predefinita) ed è equivalente al target //common:kernel_aarch64_abi_dist di Kleaf (vedi Creare elementi kernel e ABI).

La rappresentazione ABI di riferimento viene archiviata in android/abi_gki_aarch64.xml come definito dalla variabile ABI_DEFINITION in common/build.config.gki.aarch64.

Se devi aggiornare la rappresentazione ABI del kernel, il modo più pratico è utilizzare le opzioni --update e --print-report:

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

--print-report stampa le differenze tra l'ABI del file esistente e un ABI appena generato.

L'opzione --update sovrascrive la rappresentazione ABI di riferimento. Esegue inoltre l'aggiornamento dell'elenco di simboli quando si utilizza BUILD_CONFIG per un dispositivo con KMI_SYMBOL_LIST configurato.