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) i 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_DEFINITION
w common/build.config.gki.aarch64
.
Jeśli musisz zaktualizować reprezentację ABI jądra, najwygodniej jest użyć opcji --update
i --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
.