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

Les bibliothèques partagées Android évoluent de temps en temps. Conserver les binaires prédéfinis à jour demande un effort considérable. Sous Android 9 ou versions antérieures, les binaires prédéfinis qui dépendent uniquement de bibliothèques ou d'ABI supprimés lors de l'exécution. Les développeurs doivent suivre les journaux pour trouver les versions obsolètes binaires prédéfinis. Dans Android 10, une ABI basée sur des symboles du vérificateur d'utilisations. 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 quel modèle les binaires peuvent être rompus par leur modification et les binaires prédéfinis qui doivent être reconstruit.

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 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 le binaire prédéfini ne cible pas les architectures 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 LOCAL_SHARED_LIBRARIES ou shared_libs. Le système de compilation résout le module à la variante correspondante (par exemple, core ou vendor) bibliothèques.

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 éléments DT_SONAME avec le DT_NEEDED enregistrées dans le binaire prédéfini. En cas de non-concordance, une erreur est émis.

Quatrièmement, le vérificateur résout les symboles non définis dans le binaire prédéfini. Ces Les symboles non définis doivent être définis dans l'une des dépendances, et le symbole La liaison 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é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 valeurs insolubles et indéfinies , 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 suivantes:

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

Exécuter le vérificateur

L'outil de vérification couvre tous les modules prédéfinis ELF pendant le 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

Outil de correction des erreurs d'ABI

Le correcteur automatique peut vous aider à résoudre les erreurs de vérification de l'ABI. Exécutez simplement le fixateur avec Android.bp / Android.mk comme entrée, et le fixateur imprime les suggestions à corriger sur stdout. Si vous le souhaitez, exécutez l'outil de fixation avec l'option --in-place pour mettre à jour directement le fichier 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>