Lavorare con gli elenchi di simboli

Per ridurre la superficie di simboli e tipi che devono essere mantenuti stabili, il kernel GKI ha funzionalità per limitare i simboli esportati solo a quelli necessari ai moduli. Per i moduli compilati esternamente, devi avere 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 gki/aarch64/symbols/virtual_device.

Aggiungere un target per la generazione dell'elenco dei simboli

Gli elenchi di simboli vengono generati dal target kernel_abi. Aggiungi questo target al dispositivo BUILD.bazel con le seguenti opzioni:

  • name

    Deve essere nel formato <kernel_build>_abi.

  • kernel_build

    Deve contenere il nome della destinazione kernel_build del dispositivo.

Puoi anche utilizzare le seguenti opzioni:

  • kernel_modules

    Elenco delle destinazioni per i moduli out-of-tree. I moduli in-tree non devono essere inclusi qui. Consulta Preparare i moduli in-tree per l'estrazione dei simboli.

  • kmi_symbol_list_add_only

    Questa opzione impedisce la rimozione dei simboli inutilizzati. La rimozione dei simboli è consentita solo in momenti specifici durante la stabilizzazione dell'indice KMI e non è consentita una volta che l'indice KMI è bloccato.

    Ciò è utile anche quando utilizzi lo stesso elenco di simboli per più dispositivi diversi. In questo modo, non verranno rimossi i simboli utilizzati dal dispositivo A, ma non dal dispositivo B.

  • module_grouping

    Se True o non specificato, l'elenco dei simboli raggruppa i simboli in base ai moduli del kernel che fanno riferimento al simbolo. In caso contrario, l'elenco dei simboli è un elenco ordinato di simboli utilizzati da tutti i moduli del kernel.

Vedi common-modules/virtual-device/BUILD.bazel ad 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,
)

Consulta anche la documentazione di riferimento sull'obiettivo kernel_abi in Kleaf.

Preparare i moduli in-tree per l'estrazione dei simboli

Per preparare i moduli in-tree per l'estrazione dei simboli, elenca i moduli in-tree specifici del fornitore in un attributo module_outs della destinazione kernel_build. Per un esempio, vedi _VIRT_COMMON_MODULES e il suo utilizzo. Non includere i moduli GKI in questo elenco.

Configura questi moduli in modo che siano non firmati, altrimenti l'elenco dei simboli potrebbe essere vuoto. Per farlo, 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 ad esempio.

Aggiungere 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 dei simboli deve essere nel formato //common:gki/<arch>/symbols/<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:gki/aarch64/symbols/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/gki/<arch>/symbols/<device>. Per l'esempio precedente, il comando sarebbe:

touch common/gki/aarch64/symbols/virtual_device

Aggiungi questo file a additional_kmi_symbol_lists della build del kernel GKI di base. Ad esempio, //common:gki/aarch64/symbols/virtual_device viene aggiunto al gruppo di file aarch64_additional_kmi_symbol_lists, dichiarato in common/BUILD.bazel.

Aggiorna l'elenco dei simboli del dispositivo per compilare il nuovo elenco di simboli e inviarlo al repository Android Common Kernel.

Aggiornare un elenco di simboli dei dispositivi

Tutti i simboli del kernel di base utilizzati dai moduli in module_outs di kernel_build e kernel_modules di kernel_abi devono essere inclusi nell'elenco dei simboli. Puoi farlo eseguendo il target kernel_abi con il suffisso _update_symbol_list. Ad esempio, il seguente comando 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

Inviare un aggiornamento dell'elenco dei simboli ad ACK

Invia una patch con la modifica dell'elenco dei simboli a Android Common Kernel gerrit per rendere i nuovi simboli parte dell'interfaccia KMI.

Il messaggio di commit deve includere un elenco di simboli aggiunti o rimossi. Puoi scrivere questo elenco manualmente per un piccolo aggiornamento dell'elenco dei simboli o utilizzare il report $DIST_DIR/abi_stgdiff/abi.report.short dopo aver aggiornato la rappresentazione dell'ABI di riferimento.

Sebbene l'aggiornamento della rappresentazione dell'ABI di riferimento prima dell'invio di un aggiornamento dell'elenco dei simboli non sia obbligatorio, potrebbe eliminare passaggi di preinvio aggiuntivi e rendere la modifica pronta per l'invio più rapidamente. In ogni caso, viene controllato e aggiornato, se necessario, durante la pre-invio.

Utilizzare gli elenchi di simboli (Android 13)

Android 13 supporta sia gli script di build Kleaf sia quelli legacy, quindi puoi gestire gli elenchi di simboli come descritto nelle sezioni precedenti o come descritto nella sezione seguente.

Utilizzare gli elenchi di simboli (Android 12 e versioni precedenti)

Utilizza 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 le seguenti opzioni di configurazione:

  • vmlinux

    Deve far parte dell'elenco FILES. A questo scopo, puoi includere build.config.aarch64.

  • KMI_SYMBOL_LIST

    Deve essere impostato e indirizzato all'elenco dei simboli KMI da aggiornare.

Dopo aver aggiornato l'elenco dei simboli del dispositivo, devi riflettere queste modifiche anche nella build GKI (common/build.config.gki.aarch64):

  • Copia l'elenco aggiornato dei simboli in common/android/abi_gki_aarch64_<device>.

  • Verifica che android/abi_gki_aarch64_<device> sia incluso in ADDITIONAL_KMI_SYMBOL_LISTS in common/build.config.gki.aarch64.

  • Invia l'aggiornamento dell'elenco dei simboli ad ACK.