Utrzymywanie stabilnego interfejsu modułu jądra

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 lub android16-6.12.

    • W przypadku urządzenia android-mainline nie zachowuje się stabilności KMI.
  • 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ż repopliki 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?