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:
namePrecisa estar no formato
<kernel_build>_abi.kernel_buildPrecisa conter o nome do destino
kernel_builddo dispositivo.
Também é possível usar as seguintes opções:
kernel_modulesLista 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_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 é .
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_groupingSe
Trueou 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_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
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_listEnviar 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-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 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 emADDITIONAL_KMI_SYMBOL_LISTSemcommon/build.config.gki.aarch64.