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_distTo 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/distAnalizowanie 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_updateTo 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.shSpowoduje 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-reportPolecenie --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.