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:
namePrecisa estar no formato
<kernel_build>_abi.kernel_buildPrecisa conter o nome do destino do dispositivo
kernel_build.
Você também pode usar as seguintes opções:
kernel_modulesLista 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_onlyEssa 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_groupingSe
Trueou 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_deviceAdicione 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_listEnviar 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-listNeste exemplo, build.config.device precisa incluir estas opções de configuração:
vmlinuxPrecisa fazer parte da lista
FILES. Isso pode ser feito incluindobuild.config.aarch64.KMI_SYMBOL_LISTPrecisa 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 emADDITIONAL_KMI_SYMBOL_LISTSemcommon/build.config.gki.aarch64.