Utiliser des listes de symboles

Pour réduire la surface des symboles et des types qui doivent être maintenus comme stables, le noyau GKI est capable de limiter les symboles exportés à ceux qui sont nécessaires aux modules. Pour les modules compilés en externe, vous devez disposer d'une liste des symboles utilisés pour leur permettre d'être exportés par le noyau GKI. Par exemple, les symboles utilisés par les modules pour Cuttlefish sont stockés dans gki/aarch64/symbols/virtual_device.

Ajouter une cible pour la génération de la liste de symboles

Les listes de symboles sont générées par la cible kernel_abi. Ajoutez cette cible à l'appareil BUILD.bazel avec les options suivantes :

  • name

    Doit être au format <kernel_build>_abi.

  • kernel_build

    Doit contenir le nom de la cible kernel_build de l'appareil.

Vous pouvez également utiliser les options suivantes :

Voir common-modules/virtual-device/BUILD.bazel pour obtenir un exemple :

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

Consultez également la documentation de référence sur kernel_abi cible dans Kleaf.

Préparer les modules dans l'arborescence pour l'extraction de symboles

Pour préparer les modules dans l'arborescence pour l'extraction de symboles, listez les modules dans l'arborescence spécifiques au fournisseur dans un attribut module_outs de la cible kernel_build. Consultez _VIRT_COMMON_MODULES et son utilisation pour obtenir un exemple. N'incluez pas les modules GKI dans cette liste.

Configurez ces modules pour qu'ils ne soient pas signés. Sinon, la liste de symboles risque d'être vide. Pour ce faire, ajoutez cette ligne à vos fragments de configuration du noyau :

# CONFIG_MODULE_SIG_ALL is not set

Consultez common-modules/virtual-device/virtual_device_core.fragment pour obtenir un exemple.

Ajouter une liste de symboles d'appareil au build du noyau de l'appareil

Ajoutez l'attribut kmi_symbol_list à la cible kernel_build définie dans l'appareil BUILD.bazel. Le nom de la liste de symboles doit être au format de //common:gki/<arch>/symbols/<device>.

Consultez common-modules/virtual-device/BUILD.bazel, pour obtenir un exemple :

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

Créer et envoyer une liste de symboles initiale

Créez une liste de symboles vide dans common/gki/<arch>/symbols/<device>. Pour l'exemple ci-dessus, la commande serait la suivante :

touch common/gki/aarch64/symbols/virtual_device

Ajoutez ce fichier à additional_kmi_symbol_lists du build de base du noyau GKI. Par exemple, //common:gki/aarch64/symbols/virtual_device est ajouté au aarch64_additional_kmi_symbol_lists groupe de fichiers, déclaré dans common/BUILD.bazel.

Mettez à jour la liste de symboles de l'appareil pour remplir la nouvelle liste de symboles et envoyez-la au dépôt Android Common Kernel.

Mettre à jour une liste de symboles d'appareil

Tous les symboles de noyau principaux utilisés par les modules dans module_outs de kernel_build et kernel_modules de kernel_abi doivent être inclus dans la liste de symboles. Pour ce faire, exécutez la cible kernel_abi avec le suffixe _update_symbol_list. Par exemple, la commande suivante met à jour la liste de symboles pour //common-modules/virtual-device:virtual_device_aarch64 :

tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_list

Envoyer une mise à jour de la liste de symboles à ACK

Envoyez un patch avec la modification de la liste de symboles à Android Common Kernel gerrit pour que les nouveaux symboles fassent partie de l'interface KMI.

Le message de commit doit inclure une liste des symboles ajoutés ou supprimés. Vous pouvez écrire cette liste manuellement pour une petite mise à jour de la liste de symboles ou utiliser $DIST_DIR/abi_stgdiff/abi.report.short rapport après avoir mis à jour la représentation ABI de référence.

Bien qu'il ne soit pas obligatoire de mettre à jour la représentation ABI de référence avant d'envoyer une mise à jour de la liste de symboles, cela peut éliminer des étapes de pré-envoi supplémentaires et accélérer l'envoi de la modification. Dans tous les cas, elle est vérifiée et mise à jour si nécessaire lors du pré-envoi.

Utiliser des listes de symboles (Android 13)

Android 13 est compatible avec les scripts de compilation Kleaf et hérités. Vous pouvez donc gérer les listes de symboles comme décrit dans les sections précédentes ou comme décrit dans la section suivante.

Utiliser des listes de symboles (Android 12 et versions antérieures)

Utilisez l'outil build_abi.sh comme suit :

BUILD_CONFIG=path/to/build.config.device build/build_abi.sh --update-symbol-list

Dans cet exemple, build.config.device doit inclure les options de configuration suivantes :

  • vmlinux

    Doit faire partie de la liste FILES. Pour ce faire, incluez build.config.aarch64.

  • KMI_SYMBOL_LIST

    Doit être défini et pointer vers la liste de symboles KMI à mettre à jour.

Après avoir mis à jour la liste de symboles de l'appareil, vous devez également refléter ces modifications dans le build GKI (common/build.config.gki.aarch64) :

  • Copiez la liste de symboles mise à jour dans common/android/abi_gki_aarch64_<device>.

  • Vérifiez que android/abi_gki_aarch64_<device> est inclus dans ADDITIONAL_KMI_SYMBOL_LISTS dans common/build.config.gki.aarch64.

  • Envoyez la mise à jour de la liste de symboles à ACK.