Para reduzir a superfície de símbolos e tipos que precisam ser mantidos como estáveis, o kernel GKI tem a funcionalidade de limitar os símbolos exportados apenas para aqueles necessários aos módulos. Para módulos compilados externamente, você precisa ter uma lista de símbolos usados para permitir que eles sejam exportados pelo kernel GKI. Por exemplo, os símbolos usados pelos módulos para Cuttlefish são armazenados em android/abi_gki_aarch64_virtual_device
.
Adicione um destino para a geração da lista de símbolos
As listas de símbolos são geradas pelo destino kernel_abi
. Adicione este destino ao dispositivo BUILD.bazel
com as seguintes opções:
name
: deve estar no formato<kernel_build>_abi
.kernel_build
: deve conter o nome do dispositivokernel_build
alvo.
Você também pode usar as seguintes opções:
kernel_modules
: lista dos destinos para módulos fora da árvore.kmi_symbol_list_add_only
Esta opção evita a remoção de símbolos não utilizados. A remoção do símbolo só é permitida em momentos específicos durante a estabilização do KMI e não é permitida quando o KMI está congelado .
Isso também é útil quando você usa a mesma lista de símbolos para vários dispositivos diferentes. Dessa forma, não removerá os símbolos usados pelo dispositivo A, mas não pelo dispositivo B.
module_grouping
Se
True
ou não for especificado, a lista de símbolos agrupará os símbolos com base nos módulos do kernel que fazem referência ao símbolo. Caso contrário, a lista de símbolos será simplesmente uma lista ordenada de símbolos usados por todos os módulos do kernel.
Veja common-modules/virtual-device/BUILD.bazel 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 a documentação de referência sobre o destino kernel_abi
no Kleaf.
Adicione uma lista de símbolos de dispositivo à compilação 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>
. Veja common-modules/virtual-device/BUILD.bazel , 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,
)
Crie e envie uma lista inicial de símbolos
Crie uma lista de símbolos vazia em common/android/abi_gki_<arch>_<device>
. Para o exemplo acima o comando seria:
touch common/android/abi_gki_aarch64_virtual_device
Inclua este arquivo em additional_kmi_symbol_lists
da compilação base do kernel GKI. Por exemplo, //common:android/abi_gki_aarch64_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 de símbolos e envie-a para o repositório Android Common Kernel.
Atualizar uma lista de símbolos de dispositivo
Todos os símbolos principais do kernel usados pelos módulos em module_outs
de kernel_build
e kernel_modules
de kernel_abi
devem 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 seguinte comando 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
Envie uma atualização da lista de símbolos para ACK
Envie um patch com a alteração da lista de símbolos para o gerrit do Android Common Kernel para tornar os novos símbolos parte do KMI.
A mensagem de confirmação deve incluir uma lista de símbolos adicionados ou removidos. Você pode escrever esta lista manualmente para uma pequena atualização da lista de símbolos ou usar o relatório $DIST_DIR/abi.report.short
após atualizar a representação ABI de referência .
Embora não seja necessário atualizar a representação ABI de referência antes de enviar uma atualização da lista de símbolos, isso pode eliminar etapas extras de pré-envio e tornar a alteração pronta para envio mais rápido. Em qualquer caso, ele será verificado e atualizado, se necessário, durante o pré-envio.
Versões mais antigas (Android 12 e inferior)
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
deve incluir estas opções de configuração:
vmlinux
deve estar na listaFILES
. Isso pode ser feito incluindobuild.config.aarch64
.KMI_SYMBOL_LIST
deve ser definido e apontado para a lista de símbolos KMI para atualização.
Depois de atualizar a lista de símbolos do dispositivo, você também precisa refletir essas alterações na compilação 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
.