Para reducir la superficie de símbolos y tipos que deben mantenerse estables, el kernel de GKI tiene una funcionalidad para limitar los símbolos exportados solo a aquellos que necesitan los módulos. Para los módulos compilados externamente, necesita tener una lista de símbolos usados para permitir que el kernel GKI los exporte. Por ejemplo, los símbolos utilizados por los módulos de Cuttlefish se almacenan en android/abi_gki_aarch64_virtual_device
.
Agregar un objetivo para la generación de la lista de símbolos
Las listas de símbolos son generadas por el objetivo kernel_abi
. Agregue este destino al dispositivo BUILD.bazel
con las siguientes opciones:
name
Debe tener el formato
<kernel_build>_abi
.kernel_build
Debe contener el nombre del dispositivo
kernel_build
target.
También puede utilizar las siguientes opciones:
kernel_modules
Lista de objetivos para módulos fuera del árbol . Los módulos en el árbol no deberían incluirse aquí. Consulte Preparar módulos en árbol para la extracción de símbolos .
kmi_symbol_list_add_only
Esta opción evita la eliminación de símbolos no utilizados. La eliminación de símbolos solo se permite en momentos específicos durante la estabilización del KMI y no se permite una vez que el KMI está congelado .
Esto también es útil cuando utiliza la misma lista de símbolos para varios dispositivos diferentes. De esta manera no eliminará los símbolos utilizados por el dispositivo A pero no por el dispositivo B.
module_grouping
Si es
True
o no se especifica, entonces la lista de símbolos agrupará los símbolos según los módulos del kernel que hacen referencia al símbolo. De lo contrario, la lista de símbolos será simplemente una lista ordenada de símbolos utilizados por todos los módulos del kernel.
Consulte common-modules/virtual-device/BUILD.bazel, por ejemplo:
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 también la documentación de referencia sobre el objetivo kernel_abi
en Kleaf.
Prepare módulos en el árbol para la extracción de símbolos
Para preparar módulos en el árbol para la extracción de símbolos, enumere los módulos en el árbol específicos del proveedor en un atributo module_outs
del destino kernel_build
. Consulte _VIRT_COMMON_MODULES
y su uso para ver un ejemplo. No incluya módulos GKI en esta lista.
Configure estos módulos para que no estén firmados ; de lo contrario, la lista de símbolos podría estar vacía. Para hacerlo, agregue esta línea a los fragmentos de configuración de su kernel:
# CONFIG_MODULE_SIG_ALL is not set
Consulte common-modules/virtual-device/virtual_device_core.fragment, por ejemplo.
Agregue una lista de símbolos de dispositivo a la compilación del kernel del dispositivo
Agregue el atributo kmi_symbol_list
al objetivo kernel_build
definido en el dispositivo BUILD.bazel
. El nombre de la lista de símbolos debe tener el formato //common:android/abi_gki_<arch>_<device>
. Consulte common-modules/virtual-device/BUILD.bazel , por ejemplo:
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,
)
Crear y enviar una lista de símbolos inicial
Cree una lista de símbolos vacía en common/android/abi_gki_<arch>_<device>
. Para el ejemplo anterior el comando sería:
touch common/android/abi_gki_aarch64_virtual_device
Agregue este archivo a additional_kmi_symbol_lists
de la compilación base del kernel GKI. Por ejemplo, //common:android/abi_gki_aarch64_virtual_device
se agrega al grupo de archivos aarch64_additional_kmi_symbol_lists
, declarado en common/BUILD.bazel .
Actualice la lista de símbolos del dispositivo para completar la nueva lista de símbolos y envíela al repositorio de Android Common Kernel.
Actualizar una lista de símbolos de dispositivos
Todos los símbolos centrales del kernel utilizados por los módulos en module_outs
de kernel_build
y kernel_modules
de kernel_abi
deben incluirse en la lista de símbolos. Esto se puede hacer ejecutando el objetivo kernel_abi
con el sufijo _update_symbol_list
. Por ejemplo, el siguiente comando actualiza la 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 una actualización de la lista de símbolos a ACK
Envíe un parche con el cambio de la lista de símbolos al kernel común de Android para que los nuevos símbolos formen parte del KMI.
El mensaje de confirmación debe incluir una lista de símbolos agregados o eliminados. Puede escribir esta lista manualmente para una pequeña actualización de la lista de símbolos o usar el informe $DIST_DIR/abi.report.short
después de actualizar la representación ABI de referencia .
Si bien no es necesario actualizar la representación ABI de referencia antes de enviar una actualización de la lista de símbolos, puede eliminar pasos adicionales de envío previo y hacer que el cambio esté listo para enviarse más rápido. En cualquier caso, será revisado y actualizado si es necesario durante el preenvío.
Versiones anteriores (Android 12 y anteriores)
Utilice la herramienta build_abi.sh
de la siguiente manera:
BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list
En este ejemplo, build.config.device
debe incluir estas opciones de configuración:
vmlinux
Debe ser parte de la lista
FILES
. Esto se puede hacer incluyendobuild.config.aarch64
.KMI_SYMBOL_LIST
Debe configurarse y apuntar a la lista de símbolos KMI para actualizar.
Después de actualizar la lista de símbolos del dispositivo, también debe reflejar estos cambios en la compilación de GKI ( common/build.config.gki.aarch64
):
Copie la lista de símbolos actualizada en
common/android/abi_gki_aarch64_<device>
.Verifique que
android/abi_gki_aarch64_<device>
esté incluido enADDITIONAL_KMI_SYMBOL_LISTS
encommon/build.config.gki.aarch64
.