Na tej stronie opisaliśmy, jak tworzyć reprezentacje ABI jądra Androida i uruchamiać monitorowanie ABI. Dotyczy to Androida 16 lub nowszego. W przypadku starszych wersji zobacz ABI monitor w poprzednich wersjach jądra.
Zapoznaj się też z dokumentacją referencyjną Kleaf: obsługa monitorowania ABI (GKI) i obsługa monitorowania ABI (urządzenie).
Kompilowanie jądra i jego reprezentacji ABI
Po pobraniu źródeł GKI uruchom to polecenie, aby skompilować jądro i artefakty ABI GKI:
tools/bazel run //common:kernel_aarch64_abi_dist
To polecenie tworzy bieżącą reprezentację ABI i kopiuje ją do pliku $DIST_DIR/abi.stg
wraz z kompilowanym jądrem i modułami. $DIST_DIR
ma domyślnie wartość out_abi/kernel_aarch64_abi_dist/dist
.
Dodatkowe argumenty narzędzia ABI możesz podać na końcu polecenia (po --
). Aby na przykład zmienić miejsce docelowe dla ABI i elementów kompilacji, możesz użyć opcji --dist_dir
:
tools/bazel run //common:kernel_aarch64_abi_dist -- --dist_dir=out/dist
Analiza różnic ABI między wersją kompilacji a reprezentacją referencyjną
Docelowy parametr //common:kernel_aarch64_abi_dist
, który jest wykonywany w poprzednim poleceniu, analizuje i zgłasza wszelkie różnice w ABI między wersją kompilacji a reprezentacją odniesienia znajdującą się w katalogu common/gki/aarch64/abi.stg
(zdefiniowanym w pliku BUILD.bazel
). Te różnice są wyprowadzane na koniec 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 elementu kompilacji znajdującego się w folderze $DIST_DIR/abi_stgdiff/abi.report.short
, obok raportów w innych formatach.
Automatyzacja powinna używać kodu zakończenia polecenia kompilacji, który jest różny od 0, jeśli zostaną znalezione różnice.
Pamiętaj, że gałęzie fazy rozwoju, w tym android-mainline
, nie mają referencyjnej reprezentacji ABI.
Bez niego //common:kernel_aarch64_abi_dist
nie wykryje żadnych różnic.
Aktualizowanie odwołania do reprezentacji ABI
Każda zmiana, która wpływa na ABI jądra, np. aktualizacja listy symboli, musi być odzwierciedlona w reprezentacji ABI odniesienia (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 etapu Analiza różnic w ABI, a dodatkowo aktualizuje reprezentację referencyjną w źródłach. Zaktualizowany ABI można następnie przesłać w ramach tego samego zatwierdzenia, co zmiana. W wiadomości zatwierdzenia dołącz różnice ABI z raportu $DIST_DIR/abi_stgdiff/abi.report.short
.
Monitorowanie interfejsu ABI i docelowe urządzenia
Monitorowanie ABI musi być skonfigurowane tylko w przypadku docelowych wersji jądra. Mieszane konfiguracje kompilacji (te, które definiują base_kernel
), które kompilują bezpośrednio z jądrem GKI, muszą tylko dodać obsługę śledzenia listy symboli urządzenia.
Definicja ABI powinna zostać zaktualizowana za pomocą kompilacji GKI.
Zobacz też dokumentację referencyjną Kleaf: Monitorowanie obsługi ABI (urządzenie).
ABI monitoruje poprzednie wersje jądra (Android 15 i starsze)
W przypadku poprzednich wersji jądra instrukcje dotyczące kompilowania i monitorowania ABI różnią się w następujący sposób.
Android 15 i 14
Instrukcje są w większości takie same jak w Androidzie 16, z tym wyjątkiem, że referencyjna reprezentacja ABI to common/android/abi_gki_aarch64.stg
, a $DIST_DIR
domyślnie przyjmuje wartość out_abi/kernel_aarch64/dist
.
Android 13
Android 13 może być kompilowany za pomocą Kleaf lub starszych skryptów kompilacji.
W przypadku Kleaf instrukcje są takie same jak w Androidzie 14, z tym że format ABI to XML, a odniesienie do interfejsu ABI to common/android/abi_gki_aarch64.xml
.
W przypadku starszych skryptów kompilacji instrukcje są takie same jak w Androidzie 12.
Android 12 i starsze
Format ABI to XML, a reprezentacja referencyjnego interfejsu ABI to:common/android/abi_gki_aarch64.xml
Te jądra używają build.sh
zamiast Kleaf. Do monitorowania ABI należy użyć narzędzia build_abi.sh
, które akceptuje te same zmienne środowiskowe do dostosowywania kompilacji co build.sh
. Przykład:
BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh
Spowoduje to utworzenie jądra i wyodrębnienie reprezentacji ABI w OUT_DIR
(domyślnie out_abi
) podkatalogu, który jest odpowiednikiem celu //common:kernel_aarch64_abi_dist
Kleaf (patrz Kompilowanie artefaktów jądra i 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 chcesz 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
wypisuje różnice w ABI między obecną wersją pliku a nowo wygenerowanym ABI.
Opcja --update
zastępuje referencyjną reprezentację ABI. Nie wykonuje też aktualizacji listy symboli, gdy używasz elementu BUILD_CONFIG
na urządzeniu z konfigurowanym elementem KMI_SYMBOL_LIST
.