Come lavorare con gli elenchi di simboli

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 includendo build.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 in ADDITIONAL_KMI_SYMBOL_LISTS in common/build.config.gki.aarch64 .

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