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 necessários para os módulos. Para módulos compilados externamente, é necessário ter uma lista de símbolos usados para permitir que eles sejam exportados pelo kernel GKI. Por exemplo, os símbolos usados por módulos para o Cuttlefish são armazenados em gki/aarch64/symbols/virtual_device.

Adicionar um destino para a geração da lista de símbolos

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

  • name

    Precisa estar no formato <kernel_build>_abi.

  • kernel_build

    Precisa conter o nome do destino kernel_build do dispositivo.

Também é possível usar as seguintes opções:

  • kernel_modules

    Lista dos destinos para módulos externos. Os módulos internos não devem ser incluídos aqui. Consulte Preparar módulos internos 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 é .

    Isso também é útil quando você usa a mesma lista de símbolos para vários dispositivos diferentes. Dessa forma, ela não remove 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 símbolos com base nos módulos do kernel que referenciam o símbolo. Caso contrário, a lista de símbolos é uma lista classificada de símbolos usados por todos os módulos do kernel.

Consulte common-modules/virtual-device/BUILD.bazel para ver um 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.

Preparar módulos internos para extração de símbolos

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

Configure esses módulos para não serem 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 BUILD.bazel do dispositivo. O nome da lista de símbolos precisa estar no formato de //common:gki/<arch>/symbols/<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:gki/aarch64/symbols/virtual_device",
    ...
    module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)

Criar e enviar uma lista de símbolos inicial

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 aarch64_additional_kmi_symbol_lists grupo de arquivos, declarado em common/BUILD.bazel.

Atualize a lista de símbolos do dispositivo para preencher a nova lista de símbolos e envie-a ao repositório do kernel comum do Android.

Atualizar uma lista de símbolos de dispositivo

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

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

Envie um patch com a mudança da lista de símbolos para o Gerrit do kernel comum do Android para que os novos símbolos façam parte do 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 da lista de símbolos ou usar $DIST_DIR/abi_stgdiff/abi.report.short relatório após 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, ela é verificada e atualizada, se necessário, durante o pré-envio.

Trabalhar com listas de símbolos (Android 13)

O Android 13 oferece suporte a scripts de build legados e do Kleaf. 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 do KMI a ser atualizada.

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

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