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 la funcionalidad de limitar los símbolos exportados solo a aquellos que necesitan los módulos. Para los módulos compilados externamente, debe tener una lista de símbolos utilizados para permitir que el kernel GKI los exporte. Por ejemplo, los símbolos utilizados por los módulos para 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 destino kernel_abi . Agregue este objetivo al dispositivo BUILD.bazel con las siguientes opciones:

  • name : debe tener el formato de <kernel_build>_abi .

  • kernel_build : debe contener el nombre del dispositivo de destino kernel_build .

También puede usar las siguientes opciones:

  • kernel_modules : lista de objetivos para módulos fuera del árbol.

  • 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 de KMI y no se permite una vez que se congela el KMI.

    Esto también es útil cuando usa 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, la lista de símbolos agrupará los símbolos en función de los módulos del núcleo 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.

Ver 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 destino kernel_abi en Kleaf.

Agregue una lista de símbolos de dispositivos a la compilación del kernel del dispositivo

Agregue el atributo kmi_symbol_list al destino 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 básica del kernel de 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 del kernel central 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 gerrit de Android Common Kernel 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, es posible que se eliminen los pasos previos al envío adicionales y que el cambio esté listo para enviarse más rápido. En cualquier caso, se revisará y actualizará si es necesario durante el preenvío.

Versiones anteriores (Android 12 y anteriores)

Use 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 estar en la lista FILES . Esto se puede hacer incluyendo build.config.aarch64 .

  • KMI_SYMBOL_LIST debe configurarse y señalarse en la lista de símbolos KMI para actualizar.

Después de actualizar la lista de símbolos de dispositivos, 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> .

  • Compruebe 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 .