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 incluindobuild.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 emADDITIONAL_KMI_SYMBOL_LISTS
emcommon/build.config.gki.aarch64
.