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 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'utilisation des ABI basé sur des symboles est introduit. Le vérificateur peut détecter les binaires précompilés obsolètes au moment de la compilation, afin que les développeurs de bibliothèques partagées puissent savoir quels binaires précompilés peuvent être endommagés par leur modification et lesquels doivent être recompilés.
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. L'outil de vérification 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, le vérificateur 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
, par exemple) des bibliothèques partagées.
Troisièmement, le vérificateur compare les entrées DT_NEEDED
à LOCAL_SHARED_LIBRARIES
ou shared_libs
. Plus précisément, 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 s'affiche.
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é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'une des options suivantes:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Pour que le binaire précompilé ignore la vérification du fichier ELF, spécifiez l'une des options suivantes:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Exécuter le vérificateur
Pour exécuter le vérificateur, définissez la variable d'environnement CHECK_ELF_FILES
sur true
et exécutez make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
Pour activer le vérificateur par défaut, ajoutez PRODUCT_CHECK_ELF_FILES
à BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
Les précompilés sont vérifiés automatiquement lors du processus de compilation d'Android:
make