Cómo trabajar con listas de símbolos

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 incluyendo build.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 en ADDITIONAL_KMI_SYMBOL_LISTS en common/build.config.gki.aarch64 .

  • Enviar actualización de la lista de símbolos a ACK .