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 versions obsolètes binaires prédéfinis. 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 quel modèle les binaires peuvent être rompus par leur modification et les binaires prédéfinis qui doivent être reconstruit.
Vérificateur d'utilisations d'ABI basé sur les symboles
Le vérificateur d'utilisations de l'ABI basé sur les 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édéfini doivent être répertoriées
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 é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é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 avoir 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
Correcteur d'erreurs ABI
Le correcteur automatique peut vous aider à résoudre les erreurs de vérification de l'ABI. Il suffit d'exécuter le fixateur avec
Android.bp / Android.mk comme entrée, et le fixateur imprime les suggestions
à corriger sur stdout. Vous pouvez également exécuter 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>