Les bibliothèques partagées Android évoluent de temps en temps. Conserver les binaires prédéfinis à jour demande des efforts considérables. Sur Android 9 ou versions antérieures, les binaires prédéfinis qui dépendent Les bibliothèques ou ABI supprimées ne peuvent être associées qu'au moment de l'exécution. Les développeurs doivent suivre les journaux pour trouver les binaires prédéfinis obsolètes ; Sur Android 10, un vérificateur d'utilisations d'ABI basé sur des symboles est introduit. Le vérificateur peut détecter les binaires prédéfinis obsolètes au moment de la compilation, de sorte que les fichiers partagés les développeurs de bibliothèques peuvent savoir quels binaires prédéfinis peuvent être rompus et quels binaires prédéfinis doivent être recompilés.
Vérificateur de l'utilisation d'ABI basé sur des symboles
Le vérificateur d'utilisations d'ABI basé sur des symboles émule l'éditeur de liens dynamique Android sur 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, le vérificateur vérifie l'architecture cible du binaire prédéfini. Si le binaire prédéfini ne cible pas 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
. La compilation
résout les noms de module en fonction de la variante correspondante (par exemple,
core
contre vendor
) des bibliothèques partagées.
Troisièmement, le vérificateur compare les entrées DT_NEEDED
aux
LOCAL_SHARED_LIBRARIES
ou shared_libs
. En particulier,
le vérificateur extrait l'entrée DT_SONAME
de chaque élément partagé
bibliothèques et compare ces DT_SONAME
aux
Entrées DT_NEEDED
enregistrées dans le binaire prédéfini. S'il y a un
non concordante, 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
La liaison de symboles doit être GLOBAL
ou WEAK
. Si un
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'une des suivantes:
- 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 symboles indéfinis impossibles à résoudre, 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
Pour exécuter le vérificateur, définissez la variable d'environnement
CHECK_ELF_FILES
à true
et exécuter
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
vers BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
Les composants prédéfinis sont automatiquement vérifiés pendant le processus de compilation d'Android:
make