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

Les bibliothèques partagées Android évoluent de temps en temps. Maintenir à jour les binaires précompilés demande des efforts considérables. Sous Android 9 ou version antérieure, les binaires prédéfinis qui dépendent de bibliothèques ou d'ABI supprimées ne parviennent pas à s'associer qu'au moment 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'utilisations ABI basé sur les symboles est introduit. Le vérificateur peut détecter les binaires prédéfinis obsolètes au moment de la compilation, afin que les développeurs de bibliothèques partagées puissent savoir quels binaires prédéfinis peuvent être endommagés par leur modification et lesquels doivent être recompilés.

Vérificateur de l'utilisation d'ABI basé sur des symboles

L'outil de vérification des utilisations d'ABI basé sur des symboles émule l'éditeur de liens dynamique Android sur l'hôte. Le vérificateur associe le binaire prédéfini aux dépendances du binaire prédéfini et vérifie si tous les symboles non définis sont résolus.

Tout d'abord, l'outil de vérification 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 ignore le binaire précompilé.

Deuxièmement, 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 module en fonction de la variante correspondante (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 aux entrées DT_NEEDED enregistrées dans le binaire prédéfini. En cas de non-concordance, un message d'erreur est émis.

Quatrièmement, le vérificateur résout les symboles non définis dans le binaire prédéfini. Ces symboles non définis doivent être définis dans l'une des dépendances, et la liaison de symboles 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 des modules prédéfinis

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'une des options suivantes:

  • 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'un des éléments suivants:

  • 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 afin de réduire les délais de traitement:

m check-elf-files

Outil de correction des erreurs d'ABI

Le correcteur automatique peut vous aider à résoudre les erreurs de vérification de l'ABI. Il vous suffit d'exécuter le fixateur avec Android.bp / Android.mk comme entrée pour qu'il imprime le correctif suggéré sur stdout. Vous pouvez également exécuter le correcteur avec l'option --in-place pour mettre à jour directement Android.bp / Android.mk avec le correctif suggéré.

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>