Utiliser les listes de symboles

Pour réduire la surface des symboles et des types qui doivent rester stables, le noyau GKI dispose de capacités permettant de limiter les symboles exportés à ceux nécessaires aux modules. Pour les modules compilés en externe, vous devez disposer d'une liste de symboles utilisés pour permettre leur exportation par le noyau GKI. Par exemple : utilisés par les modules pour Les seiches sont stockées dans android/abi_gki_aarch64_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 à la campagne 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:

  • kernel_modules

    Liste des cibles pour les modules out-of-tree. Les modules in-tree ne doivent pas être inclus ici. Consultez Préparer des modules "in-tree" pour l'extraction de symboles

  • kmi_symbol_list_add_only

    Cette option empêche la suppression des symboles inutilisés. La suppression de symboles n'est autorisée à des moments spécifiques du KMI stabilisation et n'est pas autorisé une fois que le KMI est figée.

    Cela s'avère également utile lorsque vous utilisez la même liste de symboles pour différentes appareils. Ainsi, les symboles utilisés par l'appareil A, mais pas par l'appareil B seront conservés.

  • module_grouping

    Si la valeur est True ou non spécifiée, la liste de symboles regroupe les symboles en fonction du les modules du noyau qui référencent le symbole. Sinon, la liste de symboles est une liste triée des symboles utilisés par tous les modules du noyau.

Voir common-modules/virtual-device/Build.bazel Par 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,
)

Voir aussi documentation de référence sur la cible kernel_abi dans Kleaf.

Préparer des modules "in-tree" pour l'extraction de symboles

Pour préparer les modules "in-tree" à l'extraction de symboles, listez l'élément "in-tree" spécifique au fournisseur modules dans un attribut module_outs de la cible kernel_build. Voir _VIRT_COMMON_MODULES et son utilisation à titre d'exemple. N'incluez pas de modules GKI dans cette liste.

Configurez ces modules pour qu'ils soient unsigned [non signé], sinon la liste de symboles risque d'être vide. Pour ce faire, ajoutez cette ligne à votre noyau fragments de configuration:

# CONFIG_MODULE_SIG_ALL is not set

Voir common-modules/virtual-device/virtual_device_core.fragment par exemple.

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

Ajoutez l'attribut kmi_symbol_list à la cible kernel_build définie dans appareil BUILD.bazel. Le nom de la liste de symboles doit être au format suivant : //common:android/abi_gki_<arch>_<device> Voir common-modules/virtual-device/Build.bazel Par exemple:

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

Créer et envoyer une liste de symboles initiale

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

touch common/android/abi_gki_aarch64_virtual_device

Ajoutez ce fichier à additional_kmi_symbol_lists du build de base du noyau GKI. Pour Par exemple, //common:android/abi_gki_aarch64_virtual_device est ajouté au aarch64_additional_kmi_symbol_lists, déclaré dans common/Build.bazel.

Mettez à jour la liste des symboles de l'appareil pour qu'elle contienne la nouvelle liste. et l'envoyer au référentiel Common Kernel d'Android.

Mettre à jour une liste de symboles d'appareils

Tous les symboles de noyau de noyau utilisés par les modules dans module_outs de kernel_build et kernel_modules de kernel_abi doit être inclus dans la liste de symboles. Cela peut en exécutant la cible kernel_abi avec _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 correctif contenant la modification de la liste de symboles au Android Common Noyau pour intégrer les nouveaux symboles au KMI.

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

Pendant la mise à jour de l'ABI de référence représentation avant d'envoyer une mise à jour de la liste de symboles n'est pas requise, cela peut éliminer avant de soumettre la modification et de l’envoyer plus rapidement. Dans tous les cas, il s'agit vérifiées et mises à jour si nécessaire lors du pré-envoi.

Anciennes versions (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, vous pouvez inclure build.config.aarch64

  • KMI_SYMBOL_LIST

    Doit être défini et orienté vers la liste de symboles KMI pour la mise à jour.

Après avoir mis à jour la liste des symboles d'appareils, vous devez également répercuter 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.

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