Vérificateur d'utilisations d'ABI prédéfinis

Les bibliothèques partagées Android évoluent de temps en temps. La mise à jour des binaires précompilés demande un effort considérable. Dans Android 9 ou version antérieure, les binaires prédéfinis qui dépendent des bibliothèques ou des ABI supprimées ne parviennent pas à établir de lien lors de l'exécution. Les développeurs doivent suivre les journaux pour trouver les binaires précompilés obsolètes. Dans Android 10, un vérificateur d'utilisation de l'ABI basé sur des symboles est introduit. Le vérificateur peut détecter les binaires prédéfinis obsolètes au moment de la compilation. Les développeurs de bibliothèques partagées peuvent ainsi savoir quels binaires prédéfinis risquent d'être endommagés par leur modification et quels binaires prédéfinis doivent être recompilés.

Vérificateur des utilisations d'ABI basées sur des symboles

Le vérificateur d'utilisation de l'ABI basé sur les symboles émule l'éditeur de liens dynamiques Android sur l'hôte. Le vérificateur associe le binaire précompilé aux dépendances du binaire précompilé et vérifie si tous les symboles non définis sont résolus.

Tout d'abord, le vérificateur vérifie l'architecture cible du binaire précompilé. Si le binaire précompilé ne cible pas l'architecture ARM, AArch64, x86 ou x86-64, le vérificateur l'ignore.

Ensuite, les dépendances du binaire précompilé doivent être listées dans LOCAL_SHARED_LIBRARIES ou shared_libs. Le système de compilation résout les noms de modules en la variante correspondante (c'est-à-dire core par rapport à vendor) des bibliothèques partagées.

Troisièmement, le vérificateur compare les entrées DT_NEEDED à LOCAL_SHARED_LIBRARIES ou shared_libs. En particulier, le vérificateur extrait l'entrée DT_SONAME de chaque bibliothèque partagée et compare ces DT_SONAME avec les entrées DT_NEEDED enregistrées dans le binaire précompilé. En cas d'incohérence, un message d'erreur s'affiche.

Quatrièmement, le vérificateur résout les symboles non définis dans le binaire précompilé. Ces symboles non définis doivent être définis dans l'une des dépendances, et la liaison de symbole doit être GLOBAL ou WEAK. Si un symbole non défini ne peut pas être résolu, un message d'erreur est émis.

Propriétés du module Prebuilts

Les dépendances du binaire précompilé doivent être spécifiées dans l'un des éléments suivants :

  • Android.bp : shared_libs: ["libc", "libdl", "libm"],
  • Android.mk : LOCAL_SHARED_LIBRARIES := libc libdl libm

Si le binaire prédéfini est conçu pour comporter des symboles non définis non résolus, spécifiez l'un des éléments suivants :

  • Android.bp : allow_undefined_symbols: true,
  • Android.mk : LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Pour que le binaire prédéfini ignore la vérification du fichier ELF, spécifiez l'une des options suivantes :

  • Android.bp : check_elf_files: false,
  • Android.mk : LOCAL_CHECK_ELF_FILES := false

Exécuter le vérificateur

Le vérificateur couvre tous les modules ELF précompilés lors du processus de compilation Android.

Pour exécuter le vérificateur seul et obtenir des résultats plus rapidement :

m check-elf-files

Outil de correction des erreurs d'ABI

L'outil de correction automatique peut vous aider à résoudre les erreurs de vérification de l'ABI. Il vous suffit d'exécuter le correcteur avec Android.bp / Android.mk comme entrée, et le correcteur imprimera la correction suggérée sur stdout. Vous pouvez également exécuter le correcteur avec l'option --in-place pour mettre à jour directement Android.bp / Android.mk avec la correction suggérée.

Pour Android.bp,

m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>

Pour Android.mk,

m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>