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

Les bibliothèques partagées Android évoluent de temps en temps. Il faut déployer des efforts considérables pour maintenir les binaires prédéfinis à jour. Dans Android 9 ou version antérieure, les binaires prédéfinis qui dépendent de bibliothèques ou d'ABI supprimées ne peuvent être liés qu'au moment de l'exécution. Les développeurs doivent suivre les journaux pour trouver les binaires prédéfinis obsolètes. Dans Android 10, un vérificateur d'utilisation d'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. 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 lesquels doivent être recompilés.

Vérificateur d'utilisation d'ABI basé sur les symboles

Le vérificateur d'utilisation d'ABI basé sur les symboles émule l'éditeur de liens dynamiques Android sur l'hôte. Il lie le binaire prédéfini aux dépendances de ce dernier 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édéfini. Si le binaire prédéfini ne cible pas l'architecture ARM, AArch64, x86 ou x86-64, le vérificateur l'ignore.

Ensuite, les dépendances du binaire prédéfini 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 ou 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, il extrait l'entrée DT_SONAME de chaque bibliothèque partagée et la compare aux entrées DT_NEEDED enregistrées dans le binaire prédéfini.DT_SONAME 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 du module prédéfini

Les dépendances du binaire prédéfini 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'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 prédéfinis ELF lors du processus de compilation Android.

Pour exécuter le vérificateur seul afin d'accélérer les délais d'exécution :

m check-elf-files

Correcteur d'erreurs d'ABI

Le correcteur automatique peut vous aider à résoudre les erreurs de vérification d'ABI. Il vous suffit d'exécuter le correcteur avec Android.bp / Android.mk comme entrée. Le correcteur affiche alors la correction suggérée dans stdout. Vous pouvez également exécuter le correcteur avec l'option --in-place pour mettre directement à jour 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>