Ważne jest, aby zapewnić stabilny interfejs modułu jądra (KMI) dla modułów dostawców. Rdzeń GKI jest tworzony i dostarczany w postaci binarnej, a moduły ładowane przez dostawcę są tworzone w osobnym drzewie. Powstałe moduły rdzenia i moduły dostawców GKI muszą działać tak, jakby zostały utworzone razem.
Ogólnie społeczność Linuksa nie zgadza się z koncepcją stabilności ABI w jądrze w przypadku głównego jądra. Ze względu na różne zestawy narzędzi, konfiguracje i stale rozwijane jądro główne Linuksa nie da się utrzymać stabilnego KMI w głównym nurcie. Można jednak utrzymać stabilny współczynnik KMI w środowisku GKI o wysokich ograniczeniach, stosując te ograniczenia:
Do kompilacji jądra można użyć tylko jednej konfiguracji,
gki_defconfig
.KMI jest stabilny tylko w przypadku tej samej wersji jądra LTS i Androida, np.
android13-5.10
,android12-5.10
lubandroid13-5.15
.- W przypadku
android-mainline
nie jest utrzymywana stabilność KMI.
- W przypadku
Do kompilowania jądra i modułów służy tylko określona łańcuch narzędzi Clang dostarczony w AOSP i zdefiniowany dla odpowiedniej gałęzi.
Stabilność i oznaczenie jako symboli KMI podlegają tylko te symbole, które są używane przez moduły zgodnie z listą symboli.
- Oznacza to, że moduły dostawców mogą używać tylko symboli KMI. To ograniczenie jest egzekwowane przez nieudane wczytywanie modułów, jeśli wymagane są symbole inne niż KMI.
Po zamrożeniu gałęzi KMI można wprowadzić zmiany, ale nie mogą one naruszać KMI. Te zmiany obejmują:
- Zmiany w konfiguracji
- Zmiany w kodzie jądra
- zmiany w ekosystemie narzędzi (w tym aktualizacje);
Używanie hermetycznego procesu kompilacji i łańcucha narzędzi LLVM
Proces hermetycznego kompilowania zapewnia stabilność KMI dzięki temu, że pliki manifestu repo
w kernel/manifest
dokładnie opisują środowisko kompilacji. Na przykład plik manifestu android13-5.15
zawiera narzędzia, skrypty kompilacji i wszystko inne, co jest wymagane do skompilowania obrazu jądra Generic Kernel Image (GKI). Odpowiednie pliki konfiguracji build.config
, takie jak plik konfiguracji kompilacji GKI build.config.gki.aarch64
, zapewniają prawidłowe używanie dołączonych narzędzi do generowania spójnych wyników kompilacji.
Korzystanie z hermetycznego procesu kompilacji zapewnia też spójność opisu ABI dla drzewa niezależnie od tego, czy został wygenerowany przez Google (np.
abi_gki_aarch64.xml
w przypadku android13-5.15
) czy w drzewie lokalnym, które zawiera moduły dostawcy. Narzędzia do tworzenia i porównywania opisu ABI interfejsu Kernel Module Interface (KMI) są również dostępne w repozytorium opisanym w pliku manifestu.
Zestaw narzędzi używany do kompilowania rdzenia GKI musi być w pełni zgodny z zestawem narzędzi używanym do kompilowania modułów dostawców. Od Androida 10 wszystkie jądra Androida muszą być kompilowane za pomocą zestawu 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 KMI był zgodny z jądrem GKI. Zalecamy korzystanie z dostępnych narzędzi do kompilacji, ponieważ zapewniają one najlepszą zgodność.
Co dalej?
Instrukcje dotyczące kompilowania jądra za pomocą hermetycznego procesu kompilacji i zestawu narzędzi LLVM znajdziesz w artykule Kompilowanie jąder.
Instrukcje monitorowania ABI i rozwiązywania problemów znajdziesz w artykule Monitorowanie ABI jądra Androida.