Kluczowe jest utrzymanie stabilnego interfejsu modułu jądra (KMI) dla modułów dostawcy. Jądro GKI jest kompilowane i dostarczane w formacie binarnym, a moduły ładowane przez dostawcę są kompilowane w osobnym drzewie. Wynikowe jądro GKI i moduły dostawcy muszą działać tak, jakby zostały skompilowane razem.
Ogólnie społeczność Linuksa nie akceptuje koncepcji stabilności interfejsu ABI w jądrze w przypadku głównego jądra. W obliczu różnych łańcuchów narzędzi, konfiguracji i stale rozwijającego się głównego jądra Linuksa nie da się utrzymać stabilnego interfejsu KMI w głównej gałęzi. W środowisku GKI o dużych ograniczeniach można jednak utrzymać stabilny interfejs KMI, jeśli spełnione są te warunki:
Do skompilowania jądra można użyć tylko jednej konfiguracji,
gki_defconfig
.Interfejs KMI jest stabilny tylko w ramach tej samej wersji LTS i wersji Androida jądra, np.
android14-6.1
,android15-6.6
lubandroid16-6.12
.- W przypadku urządzenia
android-mainline
nie zachowuje się stabilności KMI.
- W przypadku urządzenia
Do kompilowania jądra i modułów używany jest tylko konkretny łańcuch narzędzi Clang dostarczony w AOSP i zdefiniowany dla odpowiedniej gałęzi.
Stabilność monitorowana jest tylko w przypadku symboli, które są używane przez moduły zgodnie z listą symboli, i tylko one są uznawane za symbole KMI.
- Z tego wynika, że moduły dostawców muszą używać tylko symboli KMI. To ograniczenie jest egzekwowane przez niepowodzenie wczytywania modułów, jeśli wymagane są symbole inne niż KMI.
Po zamrożeniu gałęzi KMI zmiany są dozwolone, ale nie mogą naruszać KMI. Oto co się zmieni:
- Zmiany konfiguracji
- Zmiany w kodzie jądra
- Zmiany w zestawie narzędzi (w tym aktualizacje)
Korzystanie z procesu hermetycznego kompilowania i łańcucha narzędzi LLVM
Proces hermetycznego kompilowania zapewnia stabilny interfejs KMI, ponieważ repo
pliki manifestukernel/manifest
w pełni opisują środowisko kompilacji. Na przykład manifest android16-6.12
zawiera łańcuch narzędzi, system kompilacji i wszystkie inne elementy wymagane do utworzenia jądra Generic Kernel Image (GKI). Konfiguracja kompilacji, przede wszystkim BUILD.bazel
, zapewnia prawidłowe użycie dołączonych narzędzi do generowania spójnych wyników kompilacji.
Korzystanie z hermetycznego procesu kompilacji zapewnia też, że opis ABI drzewa jest spójny niezależnie od tego, czy został wygenerowany przez Google (np. gki/aarch64/abi.stg
w przypadku android16-6.12
), czy w lokalnym drzewie, które zawiera moduły dostawcy. W repozytorium opisanym w manifeście znajdują się też narzędzia do tworzenia i porównywania opisu ABI interfejsu modułu jądra (KMI).
Łańcuch narzędzi używany do tworzenia jądra GKI musi być w pełni zgodny z łańcuchem narzędzi używanym do tworzenia modułów dostawcy. Od Androida 10 wszystkie jądra Androida muszą być kompilowane za pomocą łańcucha narzędzi LLVM. W przypadku GKI łańcuch narzędzi LLVM używany do kompilowania jąder produktów i modułów dostawców musi generować ten sam interfejs ABI co łańcuch narzędzi LLVM z AOSP, a partnerzy muszą zadbać o to, aby interfejs KMI był zgodny z jądrem GKI. Zdecydowanie zalecamy korzystanie z udostępnionych narzędzi do kompilacji, ponieważ zapewniają one najlepszą zgodność.
Co dalej?
Instrukcje kompilowania jądra za pomocą hermetycznego procesu kompilacji i zestawu narzędzi LLVM znajdziesz w artykule Kompilowanie jąder.
Instrukcje monitorowania interfejsu ABI i rozwiązywania problemów znajdziesz w artykule Monitorowanie interfejsu ABI jądra Androida.