Como trabalhar com listas de símbolos

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

Adicione um destino 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 dispositivo kernel_build alvo.

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

  • kernel_modules : lista dos destinos para módulos fora da árvore.

  • 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 está congelado .

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

  • module_grouping

    Se True ou não for especificado, a lista de símbolos agrupará os 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.

Veja 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.

Adicione uma lista de símbolos de dispositivo à 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> . Veja 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

Inclua este arquivo em 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 dispositivo

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 seguinte comando 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 confirmação 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 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 rápido. Em qualquer caso, ele será verificado e atualizado, se necessário, durante o pré-envio.

Versões mais antigas (Android 12 e inferior)

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 estar na 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 do dispositivo, 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 .

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