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