Como trabalhar com listas de símbolos

Para reduzir a superfície de símbolos e tipos que precisam ser mantidos estáveis, o kernel GKI tem funcionalidade para limitar os símbolos exportados apenas àqueles que são necessários aos módulos. Para módulos compilados externamente, você precisa ter uma lista de símbolos usados ​​para permitir que sejam exportados pelo kernel GKI. Por exemplo, os símbolos usados ​​pelos módulos do Cuttlefish são armazenados em android/abi_gki_aarch64_virtual_device .

Adicione um alvo para a geração da lista de símbolos

As listas de símbolos são geradas pelo destino kernel_abi . Adicione este destino ao dispositivo BUILD.bazel com as seguintes opções:

  • name

    Deve estar no formato <kernel_build>_abi .

  • kernel_build

    Deve conter o nome do destino kernel_build do dispositivo.

Você também pode usar as seguintes opções:

  • kernel_modules

    Lista dos alvos para módulos fora da árvore . Módulos na árvore não devem ser incluídos aqui. Consulte Preparar módulos na árvore para extração de símbolos .

  • kmi_symbol_list_add_only

    Esta opção evita a remoção de símbolos não utilizados. A remoção do símbolo só é permitida em momentos específicos durante a estabilização do KMI e não é permitida quando o KMI estiver congelado .

    Isto também é útil quando você usa a mesma lista de símbolos para vários dispositivos diferentes. Dessa forma, não removerá símbolos usados ​​pelo dispositivo A, mas não pelo dispositivo B.

  • module_grouping

    Se for True ou não especificado, a lista de símbolos agrupará símbolos com base nos módulos do kernel que fazem referência ao símbolo. Caso contrário, a lista de símbolos será simplesmente uma lista ordenada de símbolos usados ​​por todos os módulos do kernel.

Consulte common-modules/virtual-device/BUILD.bazel por exemplo:

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,
)

Consulte também a documentação de referência sobre o destino kernel_abi no Kleaf.

Prepare módulos na árvore para extração de símbolos

Para preparar módulos na árvore para extração de símbolos, liste os módulos na árvore específicos do fornecedor em um atributo module_outs do destino kernel_build . Consulte _VIRT_COMMON_MODULES e seu uso para obter um exemplo. Não inclua módulos GKI nesta lista.

Configure esses módulos para serem unsigned , caso contrário a lista de símbolos poderá estar vazia. Para fazer isso, adicione esta linha aos fragmentos de configuração do kernel:

# CONFIG_MODULE_SIG_ALL is not set

Veja common-modules/virtual-device/virtual_device_core.fragment por exemplo.

Adicione uma lista de símbolos de dispositivos à compilação do kernel do dispositivo

Adicione o atributo kmi_symbol_list ao destino kernel_build definido no dispositivo BUILD.bazel . O nome da lista de símbolos deve estar no formato //common:android/abi_gki_<arch>_<device> . Consulte common-modules/virtual-device/BUILD.bazel , por exemplo:

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,
)

Crie e envie uma lista inicial de símbolos

Crie uma lista de símbolos vazia em common/android/abi_gki_<arch>_<device> . Para o exemplo acima o comando seria:

touch common/android/abi_gki_aarch64_virtual_device

Adicione este arquivo a additional_kmi_symbol_lists da compilação base do kernel GKI. Por exemplo, //common:android/abi_gki_aarch64_virtual_device é adicionado ao grupo de arquivos aarch64_additional_kmi_symbol_lists , declarado em common/BUILD.bazel .

Atualize a lista de símbolos do dispositivo para preencher a nova lista de símbolos e envie-a para o repositório Android Common Kernel.

Atualizar uma lista de símbolos de dispositivos

Todos os símbolos principais do kernel usados ​​pelos módulos em module_outs de kernel_build e kernel_modules de kernel_abi devem ser incluídos na lista de símbolos. Isso pode ser feito executando o destino kernel_abi com o sufixo _update_symbol_list . Por exemplo, o comando a seguir atualiza a lista de símbolos para //common-modules/virtual-device:virtual_device_aarch64 :

tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list

Envie uma atualização da lista de símbolos para ACK

Envie um patch com a alteração da lista de símbolos para o gerrit do Android Common Kernel para tornar os novos símbolos parte do KMI.

A mensagem de commit deve incluir uma lista de símbolos adicionados ou removidos. Você pode escrever esta lista manualmente para uma pequena atualização da lista de símbolos ou usar o relatório $DIST_DIR/abi.report.short após atualizar a representação ABI de referência .

Embora não seja necessário atualizar a representação da ABI de referência antes de enviar uma atualização da lista de símbolos, isso pode eliminar etapas extras de pré-envio e tornar a alteração pronta para envio mais rapidamente. Em qualquer caso, será verificado e atualizado, se necessário, durante o pré-envio.

Versões mais antigas (Android 12 e inferiores)

Use a ferramenta build_abi.sh da seguinte maneira:

BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list

Neste exemplo, build.config.device deve incluir estas opções de configuração:

  • vmlinux

    Deve fazer parte da lista FILES . Isso pode ser feito incluindo build.config.aarch64 .

  • KMI_SYMBOL_LIST

    Deve ser definido e apontado para a lista de símbolos KMI para atualização.

Depois de atualizar a lista de símbolos de dispositivos, você também precisa refletir essas alterações na compilação do GKI ( common/build.config.gki.aarch64 ):

  • Copie a lista de símbolos atualizada para common/android/abi_gki_aarch64_<device> .

  • Verifique se android/abi_gki_aarch64_<device> está incluído em ADDITIONAL_KMI_SYMBOL_LISTS em common/build.config.gki.aarch64 .

  • Envie a atualização da lista de símbolos para ACK .