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 recursos para limitar os símbolos exportados apenas àqueles que são necessários para os módulos. Para módulos compilados externamente, você precisa ter uma lista de símbolos usados para permitir que eles sejam exportados pelo kernel da GKI. Por exemplo, os símbolos usados pelos módulos para Cuttlefish são armazenados em gki/aarch64/symbols/virtual_device.

Adicionar uma meta para a geração da lista de símbolos

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

  • name

    Precisa estar no formato <kernel_build>_abi.

  • kernel_build

    Precisa conter o nome do destino do dispositivo kernel_build.

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

  • kernel_modules

    Lista de destinos para módulos fora da árvore. Os módulos in-tree não devem ser incluídos aqui. Consulte Preparar módulos em árvore para extração de símbolos.

  • kmi_symbol_list_add_only

    Essa opção impede a remoção de símbolos não utilizados. A remoção de símbolos só é permitida em momentos específicos durante a estabilização do KMI e não é permitida depois que o KMI é congelado.

    Isso também é útil quando você usa a mesma lista de símbolos em vários dispositivos diferentes. Assim, não serão removidos símbolos usados pelo dispositivo A, mas não pelo dispositivo B.

  • module_grouping

    Se True ou não especificado, a lista de símbolos agrupa os símbolos com base nos módulos do kernel que fazem referência a eles. Caso contrário, a lista de símbolos será uma lista classificada de símbolos usados por todos os módulos do kernel.

Por exemplo, consulte common-modules/virtual-device/BUILD.bazel:

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.

Preparar módulos em árvore para extração de símbolos

Para preparar módulos em árvore para extração de símbolos, liste os módulos em árvore específicos do fornecedor em um atributo module_outs da meta kernel_build. Consulte _VIRT_COMMON_MODULES e o uso dele para ver um exemplo. Não inclua módulos de GKI nessa lista.

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

# CONFIG_MODULE_SIG_ALL is not set

Consulte common-modules/virtual-device/virtual_device_core.fragment para ver um exemplo.

Adicionar uma lista de símbolos de dispositivo ao build 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 precisa estar no formato //common:gki/<arch>/symbols/<device>.

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

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

Criar e enviar uma lista inicial de símbolos

Crie uma lista de símbolos vazia em common/gki/<arch>/symbols/<device>. Para o exemplo acima, o comando seria:

touch common/gki/aarch64/symbols/virtual_device

Adicione esse arquivo a additional_kmi_symbol_lists do build do kernel GKI de base. Por exemplo, //common:gki/aarch64/symbols/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 e enviá-la ao repositório do kernel comum do Android.

Atualizar uma lista de símbolos de dispositivos

Todos os símbolos principais do kernel usados por módulos em module_outs de kernel_build e kernel_modules de kernel_abi precisam ser incluídos na lista de símbolos. Para isso, execute 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

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

Envie um patch com a mudança na lista de símbolos para o Android Common Kernel gerrit para que os novos símbolos façam parte da KMI.

A mensagem de commit precisa incluir uma lista de símbolos adicionados ou removidos. Você pode escrever essa lista manualmente para uma pequena atualização de lista de símbolos ou usar o relatório $DIST_DIR/abi_stgdiff/abi.report.short depois de atualizar a representação da 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 preparar a mudança para envio mais rápido. Em qualquer caso, ele é verificado e atualizado, se necessário, durante a pré-submissão.

Trabalhar com listas de símbolos (Android 13)

O Android 13 é compatível com Kleaf e scripts de build legados. Assim, é possível gerenciar listas de símbolos conforme descrito nas seções anteriores ou na seção a seguir.

Trabalhar com listas de símbolos (Android 12 e versões anteriores)

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 precisa incluir estas opções de configuração:

  • vmlinux

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

  • KMI_SYMBOL_LIST

    Precisa ser definido e apontado para a lista de símbolos da KMI a ser atualizada.

Depois de atualizar a lista de símbolos do dispositivo, também é necessário refletir essas mudanças na build 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.