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 des symboles
Les listes de symboles sont générées par la cible kernel_abi. Ajoutez cette cible au fichier BUILD.bazel de l'appareil avec les options suivantes :
nameIl doit être au format
<kernel_build>_abi.kernel_buildDoit contenir le nom de la cible
kernel_buildde l'appareil.
Vous pouvez également utiliser les options suivantes :
kernel_modulesListe des cibles pour les modules hors du tree source. Les modules intégrés ne doivent pas être inclus ici. Consultez Préparer les modules intégrés pour l'extraction de symboles.
kmi_symbol_list_add_onlyCette option empêche la suppression des symboles inutilisés. La suppression de symboles n'est autorisée qu'à des moments précis pendant la stabilisation du KMI et n'est pas autorisée une fois que le KMI est gelé.
Cela est également utile lorsque vous utilisez la même liste de symboles pour plusieurs appareils différents. Ainsi, les symboles utilisés par l'appareil A, mais pas par l'appareil B, ne seront pas supprimés.
module_groupingSi la valeur est
Trueou non spécifiée, la liste des symboles regroupe les symboles en fonction des modules du noyau qui font référence au symbole. Sinon, la liste des symboles est une liste triée des symboles utilisés par tous les modules du noyau.
Par exemple, consultez common-modules/virtual-device/BUILD.bazel :
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 la cible kernel_abi dans Kleaf.
Préparer les modules intégrés pour l'extraction des symboles
Pour préparer les modules intégrés à l'extraction des symboles, listez les modules intégrés spécifiques au fournisseur dans un attribut module_outs de la cible kernel_build. Pour obtenir un exemple, consultez _VIRT_COMMON_MODULES et son utilisation. N'incluez pas les modules GKI dans cette liste.
Configurez ces modules comme non signés, sinon la liste des symboles risque d'être vide. Pour ce faire, ajoutez la ligne suivante à vos fragments de configuration du noyau :
# CONFIG_MODULE_SIG_ALL is not set
Pour voir un exemple, consultez common-modules/virtual-device/virtual_device_core.fragment.
Ajouter une liste de symboles d'appareil à la compilation du noyau de l'appareil
Ajoutez l'attribut kmi_symbol_list à la cible kernel_build définie dans le BUILD.bazel de l'appareil. Le nom de la liste de symboles doit être au format //common:gki/<arch>/symbols/<device>.
Par exemple, consultez common-modules/virtual-device/BUILD.bazel :
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 à l'emplacement common/gki/<arch>/symbols/<device>. Pour l'exemple ci-dessus, la commande serait la suivante :
touch common/gki/aarch64/symbols/virtual_deviceAjoutez ce fichier à additional_kmi_symbol_lists de la compilation du noyau GKI de base. Par exemple, //common:gki/aarch64/symbols/virtual_device est ajouté au groupe de fichiers aarch64_additional_kmi_symbol_lists, déclaré dans common/BUILD.bazel.
Mettez à jour la liste des symboles de l'appareil pour remplir la nouvelle liste de symboles et l'envoyer au dépôt Android Common Kernel.
Mettre à jour une liste de symboles d'appareils
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 des 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 des symboles pour //common-modules/virtual-device:virtual_device_aarch64 :
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_abi_update_symbol_listEnvoyer une mise à jour de la liste des symboles à ACK
Envoyez un correctif avec la modification de la liste des symboles au gerrit du noyau commun Android 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 des symboles ou utiliser le rapport $DIST_DIR/abi_stgdiff/abi.report.short après avoir mis à jour la représentation de l'ABI de référence.
Bien qu'il ne soit pas obligatoire de mettre à jour la représentation de l'ABI de référence avant d'envoyer une mise à jour de la liste des symboles, cela peut éliminer des étapes de pré-envoi supplémentaires et rendre la modification prête à être envoyée plus rapidement. Dans tous les cas, il est vérifié et mis à jour si nécessaire lors de la vérification avant envoi.
Utiliser des listes de symboles (Android 13)
Android 13 est compatible avec les scripts de compilation Kleaf et les scripts de compilation hérités. Vous pouvez donc gérer les listes de symboles comme décrit dans les sections précédentes ou 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-listDans cet exemple, build.config.device doit inclure les options de configuration suivantes :
vmlinuxDoit faire partie de la liste
FILES. Pour ce faire, incluezbuild.config.aarch64.KMI_SYMBOL_LISTDoit être défini et pointer vers la liste des symboles KMI à mettre à jour.
Après avoir mis à jour la liste des symboles d'appareil, vous devez également refléter ces modifications dans la compilation 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 dansADDITIONAL_KMI_SYMBOL_LISTSdanscommon/build.config.gki.aarch64.