Per ridurre la superficie di simboli e tipi che devono essere mantenuti stabili, il kernel GKI dispone di funzionalità per limitare i simboli esportati solo a quelli necessari ai moduli. Per i moduli compilati esternamente, è necessario disporre di un elenco di simboli utilizzati per consentirne l'esportazione da parte del kernel GKI. Ad esempio, i simboli utilizzati dai moduli per Cuttlefish sono archiviati in android/abi_gki_aarch64_virtual_device
.
Aggiungi una destinazione per la generazione dell'elenco di simboli
Gli elenchi di simboli sono generati dal target kernel_abi
. Aggiungi questo target al dispositivo BUILD.bazel
con le seguenti opzioni:
name
Dovrebbe essere nel formato
<kernel_build>_abi
.kernel_build
Dovrebbe contenere il nome del dispositivo di destinazione
kernel_build
.
Puoi anche utilizzare le seguenti opzioni:
kernel_modules
Elenco degli obiettivi per i moduli fuori albero . I moduli nell'albero non dovrebbero essere inclusi qui. Fare riferimento a Preparare i moduli nell'albero per l'estrazione dei simboli .
kmi_symbol_list_add_only
Questa opzione impedisce la rimozione dei simboli non utilizzati. La rimozione dei simboli è consentita solo in momenti specifici durante la stabilizzazione del KMI e non è consentita una volta che il KMI è congelato .
Ciò è utile anche quando si utilizza lo stesso elenco di simboli per più dispositivi diversi. In questo modo non rimuoverà i simboli utilizzati dal dispositivo A ma non dal dispositivo B.
module_grouping
Se
True
o non specificato, l'elenco dei simboli raggrupperà i simboli in base ai moduli del kernel che fanno riferimento al simbolo. Altrimenti l'elenco dei simboli sarà semplicemente un elenco ordinato di simboli utilizzati da tutti i moduli del kernel.
Vedi common-modules/virtual-device/BUILD.bazel per esempio:
kernel_abi(
name = "virtual_device_aarch64_abi",
kernel_build = ":virtual_device_aarch64",
kernel_modules = [
":virtual_device_aarch64_external_modules",
],
kmi_symbol_list_add_only = True,
)
Vedi anche la documentazione di riferimento sul target kernel_abi
in Kleaf.
Preparare i moduli nell'albero per l'estrazione dei simboli
Per preparare i moduli nell'albero per l'estrazione dei simboli, elenca i moduli nell'albero specifici del fornitore in un attributo module_outs
del target kernel_build
. Vedi _VIRT_COMMON_MODULES
e il suo utilizzo per un esempio. Non includere i moduli GKI in questo elenco.
Configura questi moduli in modo che siano senza segno , altrimenti l'elenco dei simboli potrebbe essere vuoto. Per fare ciò, aggiungi questa riga ai frammenti di configurazione del kernel:
# CONFIG_MODULE_SIG_ALL is not set
Vedi common-modules/virtual-device/virtual_device_core.fragment per esempio.
Aggiungi un elenco di simboli del dispositivo alla build del kernel del dispositivo
Aggiungi l'attributo kmi_symbol_list
al target kernel_build
definito nel dispositivo BUILD.bazel
. Il nome dell'elenco di simboli deve essere nel formato //common:android/abi_gki_<arch>_<device>
. Vedi common-modules/virtual-device/BUILD.bazel , ad esempio:
kernel_build(
name = "virtual_device_aarch64",
base_kernel = "//common:kernel_aarch64",
kmi_symbol_list = "//common:android/abi_gki_aarch64_virtual_device",
...
module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)
Creare e inviare un elenco iniziale di simboli
Crea un elenco di simboli vuoto in common/android/abi_gki_<arch>_<device>
. Per l'esempio sopra il comando sarebbe:
touch common/android/abi_gki_aarch64_virtual_device
Aggiungi questo file a additional_kmi_symbol_lists
della build del kernel GKI di base. Ad esempio, //common:android/abi_gki_aarch64_virtual_device
viene aggiunto al filegroup aarch64_additional_kmi_symbol_lists
, dichiarato in common/BUILD.bazel .
Aggiorna l'elenco dei simboli del dispositivo per riempire il nuovo elenco dei simboli e inviarlo al repository Android Common Kernel.
Aggiorna un elenco di simboli del dispositivo
Tutti i simboli core del kernel utilizzati dai moduli in module_outs
di kernel_build
e kernel_modules
di kernel_abi
dovrebbero essere inclusi nell'elenco dei simboli. Questo può essere fatto eseguendo il target kernel_abi
con il suffisso _update_symbol_list
. Ad esempio, il comando seguente aggiorna l'elenco dei simboli per //common-modules/virtual-device:virtual_device_aarch64
:
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list
Invia un aggiornamento dell'elenco dei simboli a ACK
Invia una patch con la modifica dell'elenco dei simboli al gerrit Common Kernel di Android per rendere i nuovi simboli parte del KMI.
Il messaggio di commit dovrebbe includere un elenco di simboli aggiunti o rimossi. È possibile scrivere questo elenco manualmente per un piccolo aggiornamento dell'elenco di simboli oppure utilizzare il report $DIST_DIR/abi.report.short
dopo aver aggiornato la rappresentazione ABI di riferimento .
Anche se non è necessario aggiornare la rappresentazione ABI di riferimento prima di inviare un aggiornamento dell'elenco di simboli, ciò potrebbe eliminare passaggi aggiuntivi di preinvio e rendere la modifica pronta per l'invio più rapidamente. In ogni caso verrà verificato ed eventualmente aggiornato in fase di presubmit.
Versioni precedenti (Android 12 e precedenti)
Utilizzare lo strumento build_abi.sh
come segue:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
In questo esempio, build.config.device
deve includere queste opzioni di configurazione:
vmlinux
Deve far parte dell'elenco
FILES
. Questo può essere fatto includendobuild.config.aarch64
.KMI_SYMBOL_LIST
Deve essere impostato e puntato sull'elenco dei simboli KMI da aggiornare.
Dopo aver aggiornato l'elenco dei simboli dei dispositivi è necessario riflettere anche queste modifiche nella build GKI ( common/build.config.gki.aarch64
):
Copia l'elenco dei simboli aggiornato in
common/android/abi_gki_aarch64_<device>
.Verifica che
android/abi_gki_aarch64_<device>
sia incluso inADDITIONAL_KMI_SYMBOL_LISTS
incommon/build.config.gki.aarch64
.