Cómo trabajar con listas de símbolos

Para reducir la superficie de los símbolos y los tipos que deben mantenerse estables, el kernel del GKI tiene capacidades para limitar los símbolos exportados solo a aquellos que necesitan los módulos. En el caso de los módulos compilados de forma externa, debes tener una lista de los símbolos utilizados para permitir que el kernel del GKI los exporte. Por ejemplo, los símbolos que usan los módulos para Cuttlefish se almacenan en gki/aarch64/symbols/virtual_device.

Agrega un objetivo para la generación de la lista de símbolos

Las listas de símbolos se generan con el destino kernel_abi. Agrega este destino al BUILD.bazel del dispositivo con las siguientes opciones:

  • name

    Debe tener el formato <kernel_build>_abi.

  • kernel_build

    Debe contener el nombre del destino kernel_build del dispositivo.

También puedes usar las siguientes opciones:

  • kernel_modules

    Lista de los destinos de los módulos externos al árbol. Aquí no se deben incluir los módulos in-tree. Consulta Cómo preparar módulos dentro de un árbol para la extracción de símbolos.

  • kmi_symbol_list_add_only

    Esta opción evita la eliminación de símbolos sin usar. La eliminación de símbolos solo se permite en momentos específicos durante la estabilización de la KMI y no se permite una vez que la KMI está congelada.

    Esto también es útil cuando usas la misma lista de símbolos para varios dispositivos diferentes. De esta manera, no se quitarán los símbolos que usa el dispositivo A, pero no el dispositivo B.

  • module_grouping

    Si es True o no se especifica, la lista de símbolos agrupa los símbolos según los módulos del kernel que hacen referencia al símbolo. De lo contrario, la lista de símbolos es una lista ordenada de los símbolos que usan todos los módulos del kernel.

Consulta 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,
)

Consulta también la documentación de referencia sobre el destino kernel_abi en Kleaf.

Cómo preparar módulos dentro de un árbol para la extracción de símbolos

Para preparar módulos dentro del árbol para la extracción de símbolos, enumera los módulos dentro del árbol específicos del proveedor en un atributo module_outs del destino kernel_build. Consulta _VIRT_COMMON_MODULES y su uso para ver un ejemplo. No incluyas los módulos de GKI en esta lista.

Configura estos módulos como sin firmar; de lo contrario, es posible que la lista de símbolos esté vacía. Para ello, agrega esta línea a los fragmentos de configuración del kernel:

# CONFIG_MODULE_SIG_ALL is not set

Consulta common-modules/virtual-device/virtual_device_core.fragment, por ejemplo.

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

Agrega 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:gki/<arch>/symbols/<device>.

Consulta common-modules/virtual-device/BUILD.bazel, por ejemplo:

kernel_build(
    name = "virtual_device_aarch64",
    base_kernel = "//common:kernel_aarch64",
    kmi_symbol_list = "//common:gki/aarch64/symbols/virtual_device",
    ...
    module_outs = _VIRT_COMMON_MODULES + _VIRT_AARCH64_MODULES,
)

Crea y envía una lista de símbolos inicial

Crea una lista de símbolos vacía en common/gki/<arch>/symbols/<device>. Para el ejemplo anterior, el comando sería el siguiente:

touch common/gki/aarch64/symbols/virtual_device

Agrega este archivo a additional_kmi_symbol_lists de la compilación del kernel de GKI base. Por ejemplo, //common:gki/aarch64/symbols/virtual_device se agrega al grupo de archivos aarch64_additional_kmi_symbol_lists, declarado en common/BUILD.bazel.

Actualiza la lista de símbolos del dispositivo para completar la nueva lista de símbolos y enviarla al repositorio del kernel común de Android.

Actualiza una lista de símbolos de dispositivos

Todos los símbolos principales del kernel que usan los módulos en module_outs de kernel_build y kernel_modules de kernel_abi deben incluirse en la lista de símbolos. Para ello, ejecuta el destino 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

Envía una actualización de la lista de símbolos a ACK

Envía un parche con el cambio en la lista de símbolos al Gerrit del kernel común de Android para que los símbolos nuevos formen parte de la KMI.

El mensaje de confirmación debe incluir una lista de los símbolos agregados o quitados. Puedes escribir esta lista de forma manual para una pequeña actualización de la lista de símbolos o usar el informe $DIST_DIR/abi_stgdiff/abi.report.short después de actualizar la representación de la ABI de referencia.

Si bien no es necesario actualizar la representación de la ABI de referencia antes de enviar una actualización de la lista de símbolos, puede eliminar pasos adicionales de la verificación previa al envío y hacer que el cambio esté listo para enviarse más rápido. En cualquier caso, se verifica y actualiza si es necesario durante la etapa previa a la confirmación.

Trabaja con listas de símbolos (Android 13)

Android 13 admite tanto Kleaf como las secuencias de comandos de compilación heredadas, por lo que puedes administrar las listas de símbolos como se describe en las secciones anteriores o en la siguiente.

Cómo trabajar con listas de símbolos (Android 12 y versiones anteriores)

Usa 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 formar parte de la lista FILES. Esto se puede hacer incluyendo build.config.aarch64.

  • KMI_SYMBOL_LIST

    Se debe configurar y apuntar a la lista de símbolos del KMI que se actualizará.

Después de actualizar la lista de símbolos del dispositivo, también debes reflejar estos cambios en la compilación de GKI (common/build.config.gki.aarch64):

  • Copia la lista de símbolos actualizada en common/android/abi_gki_aarch64_<device>.

  • Comprueba que android/abi_gki_aarch64_<device> se incluya en ADDITIONAL_KMI_SYMBOL_LISTS en common/build.config.gki.aarch64.

  • Send symbol list update to ACK.