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

Les bibliothèques partagées Android évoluent de temps en temps. Maintenir à jour les binaires prédéfinis nécessite des efforts considérables. Dans Android 9 ou version antérieure, les binaires prédéfinis qui dépendent des bibliothèques ou des ABI supprimés ne parviennent pas à se lier au moment de l'exécution. Les développeurs doivent retracer les journaux pour trouver les binaires prédéfinis obsolètes. Dans Android 10, un vérificateur d'utilisations ABI basé sur des symboles est introduit. Le vérificateur peut détecter les binaires prédéfinis obsolètes au moment de la construction, afin que les développeurs de bibliothèques partagées puissent savoir quels binaires prédéfinis pourraient être endommagés par leur modification et quels binaires prédéfinis doivent être reconstruits.

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

Le vérificateur d'utilisations ABI basé sur des symboles émule l'éditeur de liens dynamique Android sur l'hôte. Le vérificateur relie 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, 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 ignore le binaire prédéfini.

Deuxièmement, les dépendances du binaire prédéfini doivent être répertoriées dans LOCAL_SHARED_LIBRARIES ou shared_libs . Le système de construction résout les noms de modules en la variante correspondante (c'est-à-dire core vs. 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é-construit. 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 soit GLOBAL , soit 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 avoir des symboles non définis insolubles , 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écutez le vérificateur

Le vérificateur couvre tous les modules ELF prédéfinis pendant le processus de construction d'Android.

Pour exécuter le vérificateur seul afin d'obtenir des délais d'exécution plus rapides :

m check-elf-files

Correcteur d'erreur ABI

Le fixateur automatique peut aider à résoudre les erreurs de vérification ABI. Exécutez simplement le fixateur avec Android.bp / Android.mk comme entrée, et le fixateur imprimera le correctif suggéré sur la sortie standard. Vous pouvez éventuellement 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>