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 de GKI tem recursos para limitar os símbolos exportados apenas àqueles necessárias para os módulos. Para módulos compilados externamente, é preciso ter uma lista de símbolos usados para permitir que sejam exportados pelo kernel de GKI. Por exemplo: símbolos usados pelos módulos para Cuttlefish são armazenados no android/abi_gki_aarch64_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 o destino ao dispositivo BUILD.bazel com as seguintes opções:

  • name

    Precisa estar no formato <kernel_build>_abi.

  • kernel_build

    Deve conter o nome do destino de kernel_build do dispositivo.

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

  • kernel_modules

    Lista dos destinos para módulos out-of-tree. Módulos em árvore não devem ser incluído aqui. Consulte Prepare módulos em árvore para extração de símbolos.

  • kmi_symbol_list_add_only

    Essa opção evita a remoção de símbolos não utilizados. A remoção do símbolo só permitido em horários específicos durante o KMI Estabilização e não é permitido quando o KMI é congelado.

    Isso também é útil quando você usa a mesma lista de símbolos para múltiplos símbolos dispositivos. Dessa forma, ela não vai 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á os símbolos com base no módulos do kernel que fazem referência ao símbolo. Caso contrário, a lista de símbolos será uma lista classificada de símbolos usados por todos os módulos do kernel.

Consulte common-modules/virtual-device/BUILD.bazel (link em inglês) 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 documentação de referência no 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 na árvore específicos do fornecedor módulos em um atributo module_outs do destino kernel_build. Consulte _VIRT_COMMON_MODULES e do uso dela como exemplo. Não inclua módulos GKI nessa lista.

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

# CONFIG_MODULE_SIG_ALL is not set

Consulte common-modules/virtual-device/virtual_device_core.fragment (link em inglês) por 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 deve estar no formato //common:android/abi_gki_<arch>_<device>: Consulte common-modules/virtual-device/BUILD.bazel (link em inglês) 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,
)

Criar e enviar uma lista inicial de símbolos

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

touch common/android/abi_gki_aarch64_virtual_device

Adicione esse arquivo ao additional_kmi_symbol_lists do build de base do kernel de GKI. Para exemplo, a //common:android/abi_gki_aarch64_virtual_device é adicionada Grupo de arquivos aarch64_additional_kmi_symbol_lists, declarado em common/BUILD.bazel (link em inglês).

Atualize a lista de símbolos de dispositivos para preencher a nova lista de símbolos e e enviá-lo para o repositório de kernel comum do Android.

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 deve ser incluído na lista de símbolos. Isso pode basta executar o destino kernel_abi com o _update_symbol_list sufixo. 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

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

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

A mensagem de confirmação precisa incluir uma lista de símbolos adicionados ou removidos. Você pode escreva essa lista manualmente para uma pequena atualização da lista de símbolos ou use $DIST_DIR/abi.report.short relatório depois de atualizando a ABI de referência. representação.

Ao atualizar a ABI de referência representação antes de enviar uma atualização da lista de símbolos, isso pode eliminar etapas de pré-envio e preparar a mudança para o envio mais rápido. De qualquer forma, verificados e atualizados, se necessário, durante o pré-envio.

Versões mais antigas (Android 12 e anteriores)

Use a ferramenta build_abi.sh desta forma:

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 de FILES. Para isso, inclua build.config.aarch64:

  • KMI_SYMBOL_LIST

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

Depois de atualizar a lista de símbolos de dispositivos, você também precisa refletir essas alterações no o build de 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.