È fondamentale mantenere un'interfaccia del modulo del kernel (KMI) stabile per i moduli del fornitore. Il kernel GKI viene compilato e spedito in formato binario e i moduli caricabili dal fornitore vengono compilati in un albero separato. Il kernel GKI e i moduli del fornitore risultanti devono funzionare come se fossero stati compilati insieme.
In genere, la community Linux ha disapprovato l'idea di una stabilità dell'ABI nel kernel per il kernel principale. Di fronte a toolchain, configurazioni e un kernel Linux mainline in continua evoluzione, non è fattibile mantenere una KMI stabile in mainline. Tuttavia, è possibile mantenere un KMI stabile nell'ambiente GKI altamente vincolato con questi vincoli:
Per creare il kernel può essere utilizzata una sola configurazione,
gki_defconfig
.L'interfaccia KMI è stabile solo all'interno della stessa versione LTS e Android di un kernel, ad esempio
android14-6.1
,android15-6.6
oandroid16-6.12
.- Nessuna stabilità KMI viene mantenuta per
android-mainline
.
- Nessuna stabilità KMI viene mantenuta per
Per la creazione del kernel e dei moduli viene utilizzata solo la toolchain Clang specifica fornita in AOSP e definita per il ramo corrispondente.
Solo i simboli noti per essere utilizzati dai moduli come specificato in un elenco di simboli sono monitorati per la stabilità e considerati simboli KMI.
- Il corollario è che i moduli del fornitore devono utilizzare solo simboli KMI. Questo vincolo viene applicato in caso di caricamenti di moduli non riusciti se sono necessari simboli non KMI.
Una volta bloccato il ramo KMI, le modifiche sono consentite, ma non possono interrompere il KMI. Queste modifiche includono:
- Modifiche alla configurazione
- Modifiche al codice del kernel
- Modifiche alla toolchain (inclusi gli aggiornamenti)
Utilizzare la procedura di compilazione ermetica e la toolchain LLVM
Il processo di build ermetica garantisce un KMI stabile grazie ai manifest repo
in
kernel/manifest
che descrivono completamente l'ambiente di build. Ad esempio, il
manifest per android16-6.12
include la toolchain, il sistema di compilazione e tutto il resto necessario per compilare il kernel
Generic Kernel Image (GKI). La configurazione della build, principalmente
BUILD.bazel
,
garantisce che gli strumenti inclusi vengano utilizzati correttamente per generare risultati di build coerenti.
L'utilizzo di una procedura di compilazione ermetica garantisce inoltre che la descrizione dell'ABI per l'albero sia coerente, indipendentemente dal fatto che sia generata da Google (ad esempio, gki/aarch64/abi.stg
per android16-6.12
) o in un albero locale che include i moduli del fornitore. Gli
strumenti per creare e confrontare la descrizione dell'ABI
per la Kernel Module Interface (KMI) sono forniti anche come parte del repository
descritto dal manifest.
La toolchain utilizzata per creare il kernel GKI deve essere completamente compatibile con la toolchain utilizzata per creare i moduli del fornitore. A partire da Android 10, tutti i kernel Android devono essere creati con una toolchain LLVM. Con GKI, la toolchain LLVM utilizzata per creare i kernel dei prodotti e i moduli del fornitore deve generare la stessa ABI della toolchain LLVM di AOSP e i partner devono assicurarsi che il KMI sia compatibile con il kernel GKI. L'utilizzo degli strumenti di compilazione forniti è fortemente consigliato in quanto offrono la migliore compatibilità.
Passaggi successivi
Per istruzioni sulla creazione del kernel utilizzando il processo di compilazione ermetico e la toolchain LLVM, consulta Compila i kernel.
Per istruzioni su come monitorare l'ABI e risolvere i problemi, consulta Monitoraggio dell'ABI del kernel Android