Uruchamianie monitorowania ABI

Na tej stronie dowiesz się, jak tworzyć reprezentacje interfejsu ABI jądra Androida i uruchamiać monitorowanie interfejsu ABI. Dotyczy to Androida 16 i nowszych wersji. W przypadku starszych wersji zapoznaj się z artykułem ABI monitor previous kernel versions (Monitorowanie interfejsu ABI w poprzednich wersjach jądra).

Zapoznaj się też z dokumentacją referencyjną Kleaf:Obsługa monitorowania ABI (GKI)Obsługa monitorowania ABI (urządzenie).

Tworzenie jądra i jego reprezentacji ABI

Po pobraniu źródeł GKI uruchom to polecenie, aby skompilować jądro GKI i artefakty ABI:

tools/bazel run //common:kernel_aarch64_abi_dist

To polecenie tworzy bieżącą reprezentację ABI i kopiuje ją do $DIST_DIR/abi.stg wraz z utworzonym jądrem i modułami. $DIST_DIR domyślnie ma wartość out_abi/kernel_aarch64_abi_dist/dist.

Na końcu polecenia po znaku -- możesz określić dodatkowe argumenty narzędzi ABI. Aby na przykład zmienić miejsce docelowe artefaktów ABI i kompilacji, możesz użyć opcji --destdir:

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

Analizowanie różnic w interfejsie ABI między kompilacją a reprezentacją referencyjną

Cel //common:kernel_aarch64_abi_dist, wykonany w poprzednim poleceniu, analizuje i raportuje wszelkie różnice w interfejsie ABI znalezione między kompilacją a reprezentacją referencyjną znajdującą się w common/gki/aarch64/abi.stg (zdefiniowaną w BUILD.bazel). Te różnice są wyświetlane na końcu kompilacji, jak pokazano w tym przykładzie:

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

Wydrukowany raport pochodzi z artefaktu kompilacji znajdującego się w lokalizacji $DIST_DIR/abi_stgdiff/abi.report.short. Znajdują się tam też raporty w innych formatach.

Automatyzacja powinna używać kodu zakończenia polecenia kompilacji, który jest różny od zera, jeśli zostaną znalezione różnice.

Pamiętaj, że gałęzie fazy rozwoju, w tym android-mainline, nie mają reprezentacji ABI. Bez niego funkcja //common:kernel_aarch64_abi_dist nie wykryje żadnych różnic.

Aktualizowanie reprezentacji ABI referencji

Każda zmiana, która wpływa na interfejs ABI jądra, np. aktualizacja listy symboli, musi zostać odzwierciedlona w referencyjnej reprezentacji interfejsu ABI (common/gki/aarch64/abi.stg zdefiniowanej w pliku BUILD.bazel). Aby to zrobić, uruchom to polecenie:

tools/bazel run //common:kernel_aarch64_abi_update

To polecenie wykonuje wszystkie czynności z kroku Analizowanie różnic w interfejsie ABI, a dodatkowo aktualizuje reprezentację referencyjną w kodzie źródłowym. Zaktualizowany interfejs ABI można następnie przesłać w tym samym zatwierdzeniu co zmiana. W komentarzu do zatwierdzenia uwzględnij różnice w interfejsie ABI z raportu w $DIST_DIR/abi_stgdiff/abi.report.short.

Monitorowanie interfejsu ABI i urządzenia docelowe

Monitorowanie ABI należy skonfigurować tylko w przypadku podstawowych elementów docelowych kompilacji jądra. Konfiguracje kompilacji mieszanych (które definiują base_kernel) kompilowane bezpośrednio z jądrem GKI muszą tylko dodać obsługę śledzenia listy symboli urządzenia. Definicję interfejsu ABI należy zaktualizować za pomocą kompilacji GKI.

Zobacz też dokumentację referencyjną Kleaf:Monitorowanie interfejsu ABI.

Monitorowanie interfejsu ABI poprzednich wersji jądra (Android 15 i starsze)

W przypadku poprzednich wersji jądra instrukcje dotyczące kompilacji i monitorowania interfejsu ABI różnią się w następujący sposób:

Android 15 i 14

Instrukcje są w większości takie same jak w przypadku Androida 16, z tym że referencyjna reprezentacja ABI to common/android/abi_gki_aarch64.stg, a wartość domyślna $DIST_DIR to out_abi/kernel_aarch64/dist.

Android 13

Androida 13 można skompilować za pomocą Kleaf lub starszych skryptów kompilacji.

W przypadku Kleaf instrukcje są takie same jak w przypadku Androida 14, z tym że format ABI to XML, a referencyjna reprezentacja ABI to common/android/abi_gki_aarch64.xml.

W przypadku starszych skryptów kompilacji instrukcje są takie same jak w przypadku Androida 12.

Android 12 i starsze

Format interfejsu ABI to XML, a referencyjna reprezentacja interfejsu ABI to:common/android/abi_gki_aarch64.xml

Te jądra używają build.sh zamiast Kleaf. Do monitorowania interfejsu ABI należy używać narzędzia build_abi.sh, które akceptuje te same zmienne środowiskowe do dostosowywania kompilacji co narzędzie build.sh. Na przykład:

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

Spowoduje to skompilowanie jądra i wyodrębnienie reprezentacji ABI do podkatalogu OUT_DIR (domyślnie out_abi). Jest to odpowiednik elementu docelowego //common:kernel_aarch64_abi_dist w Kleaf (patrz Kompilowanie jądra i artefaktów ABI).

Referencyjna reprezentacja ABI jest przechowywana w android/abi_gki_aarch64.xml zgodnie z definicją zmiennej ABI_DEFINITIONcommon/build.config.gki.aarch64.

Jeśli musisz zaktualizować reprezentację ABI jądra, najwygodniej jest użyć opcji --update--print-report:

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

Polecenie --print-report wyświetla różnice w ABI między plikiem w obecnej postaci a nowo wygenerowanym ABI.

Opcja --update zastępuje reprezentację ABI odniesienia. Aktualizuje też listę symboli, gdy używasz BUILD_CONFIG na urządzeniu z konfiguracją KMI_SYMBOL_LIST.