L'éditeur de liens dynamique relève deux défis dans la conception de Treble VNDK :
- Les bibliothèques partagées SP-HAL et leurs dépendances, y compris les bibliothèques VNDK-SP, sont chargées dans les processus d'infrastructure. Il devrait y avoir des mécanismes pour empêcher les conflits de symboles.
-
dlopen()
etandroid_dlopen_ext()
peuvent introduire des dépendances d'exécution qui ne sont pas visibles au moment de la construction et peuvent être difficiles à détecter à l'aide d'une analyse statique.
Ces deux défis peuvent être résolus par le mécanisme d'espace de noms de l'éditeur de liens. Ce mécanisme est fourni par l'éditeur de liens dynamique. Il peut isoler les bibliothèques partagées dans différents espaces de noms de liens afin que les bibliothèques portant le même nom de bibliothèque mais avec des symboles différents n'entrent pas en conflit.
D'autre part, le mécanisme d'espace de noms de l'éditeur de liens offre la flexibilité nécessaire pour que certaines bibliothèques partagées puissent être exportées par un espace de noms d'éditeur de liens et utilisées par un autre espace de noms d'éditeur de liens. Ces bibliothèques partagées exportées peuvent devenir des interfaces de programmation d'application qui sont publiques pour d'autres programmes tout en cachant leurs détails d'implémentation dans leurs espaces de noms de liens.
Par exemple, /system/lib[64]/libcutils.so
et /system/lib[64]/vndk-sp-${VER}/libcutils.so
sont deux bibliothèques partagées. Ces deux bibliothèques peuvent avoir des symboles différents. Ils sont chargés dans différents espaces de noms de liens afin que les modules du framework puissent dépendre de /system/lib[64]/libcutils.so
et que les bibliothèques partagées SP-HAL puissent dépendre de /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
D'autre part, /system/lib[64]/libc.so
est un exemple de bibliothèque publique exportée par un espace de noms de liens et importée dans de nombreux espaces de noms de liens. Les dépendances de /system/lib[64]/libc.so
, telles que libnetd_client.so
, sont chargées dans l'espace de noms dans lequel /system/lib[64]/libc.so
réside. Les autres espaces de noms n'auront pas accès à ces dépendances. Ce mécanisme encapsule les détails de mise en œuvre tout en fournissant les interfaces publiques.
Comment ça marche?
L'éditeur de liens dynamique est responsable du chargement des bibliothèques partagées spécifiées dans les entrées DT_NEEDED
ou des bibliothèques partagées spécifiées par l'argument de dlopen()
ou android_dlopen_ext()
. Dans les deux cas, l'éditeur de liens dynamique trouve l'espace de noms de l'éditeur de liens où réside l'appelant et tente de charger les dépendances dans le même espace de noms de l'éditeur de liens. Si l'éditeur de liens dynamique ne peut pas charger la bibliothèque partagée dans l'espace de noms de l'éditeur de liens spécifié, il demande à l'espace de noms de l'éditeur de liens lié les bibliothèques partagées exportées.
Format du fichier de configuration
Le format du fichier de configuration est basé sur le format de fichier INI. Un fichier de configuration typique ressemble à ceci :
dir.system = /system/bin dir.system = /system/xbin dir.vendor = /vendor/bin [system] additional.namespaces = sphal,vndk namespace.default.isolated = true namespace.default.search.paths = /system/${LIB} namespace.default.permitted.paths = /system/${LIB}/hw namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB} namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw namespace.sphal.isolated = true namespace.sphal.visible = true namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB} namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB} namespace.sphal.asan.search.paths = /data/asan/odm/${LIB}:/odm/${LIB} namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB} namespace.sphal.asan.permitted.paths = /data/asan/odm/${LIB}:/odm/${LIB} namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB} namespace.sphal.links = default,vndk namespace.sphal.link.default.shared_libs = libc.so:libm.so namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so namespace.vndk.isolated = true namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29 namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29 namespace.vndk.links = default namespace.vndk.link.default.shared_libs = libc.so:libm.so [vendor] namespace.default.isolated = false namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}
Le fichier de configuration comprend :
- Plusieurs propriétés de mappage de section de répertoire au début pour que l'éditeur de liens dynamique sélectionne la section effective.
- Plusieurs sections de configuration des espaces de noms de l'éditeur de liens :
- Chaque section contient plusieurs espaces de noms (sommets de graphe) et plusieurs liens de secours entre les espaces de noms (arcs de graphe).
- Chaque espace de noms possède ses propres paramètres d'isolation, de chemins de recherche, de chemins autorisés et de visibilité.
Les tableaux ci-dessous décrivent en détail la signification de chaque propriété.
Propriété de mappage de section de répertoire
Propriété | La description | Exemple |
---|---|---|
| Un chemin vers un répertoire auquel la section Chaque propriété mappe les exécutables sous le répertoire à une section de configuration des espaces de noms de l'éditeur de liens. Il peut y avoir deux propriétés (ou plus) portant le même | Cela indique que la configuration spécifiée dans la section La configuration spécifiée dans la section |
Propriétés des relations
Propriété | La description | Exemple |
---|---|---|
additional. namespaces | Une liste séparée par des virgules d'espaces de noms supplémentaires (en plus de l'espace de noms | Cela indique qu'il existe trois espaces de noms ( |
namespace. name . links | Une liste d'espaces de noms de secours séparés par des virgules. Si une bibliothèque partagée est introuvable dans l'espace de noms actuel, l'éditeur de liens dynamique tente de charger la bibliothèque partagée à partir des espaces de noms de secours. L'espace de noms spécifié au début de la liste a une priorité plus élevée. | Si une bibliothèque partagée ou un exécutable demande une bibliothèque partagée qui ne peut pas être chargée dans l'espace de noms Et puis, si la bibliothèque partagée ne peut pas non plus être chargée à partir de l'espace de noms Enfin, si toutes les tentatives échouent, l'éditeur de liens dynamique renvoie une erreur. |
namespace. name . link. other . shared_libs | Une liste de bibliothèques partagées séparées par deux-points qui peuvent être recherchées dans les Cette propriété ne peut pas être utilisée avec un espace de | Cela indique que le lien de secours accepte uniquement |
namespace. name . link. other . allow_all_shared_libs | Une valeur booléenne qui indique si toutes les bibliothèques partagées peuvent être recherchées dans l' Cette propriété ne peut pas être utilisée avec un espace de | Cela indique que tous les noms de bibliothèque peuvent parcourir le lien de secours de |
Propriétés de l'espace de noms
Propriété | La description | Exemple |
---|---|---|
namespace. name . isolated | Une valeur booléenne qui indique si l'éditeur de liens dynamique doit vérifier où réside la bibliothèque partagée. Si Si | Cela indique que seules les bibliothèques partagées dans |
namespace. name . search.paths | Une liste de répertoires séparés par deux-points pour rechercher des bibliothèques partagées. Les répertoires spécifiés dans Lorsque Par exemple, si | Cela indique que l'éditeur de liens dynamique recherche |
namespace. name . asan.search.paths | Une liste de répertoires séparés par deux-points pour rechercher des bibliothèques partagées lorsque AddressSanitizer (ASan) est activé. | Cela indique que lorsque ASan est activé, l'éditeur de liens dynamique recherche |
namespace. name . permitted.paths | Une liste de répertoires séparés par deux-points (y compris les sous-répertoires) où l'éditeur de liens dynamique peut charger Les bibliothèques partagées qui se trouvent dans les sous-répertoires de Si | Cela indique que les bibliothèques partagées sous Par exemple, sans |
namespace. name . asan.permitted.paths | Une liste de répertoires séparés par deux-points où l'éditeur de liens dynamique peut charger les bibliothèques partagées lorsque ASan est activé. | Cela indique que lorsque ASan est activé, les bibliothèques partagées sous |
namespace. name . visible | Une valeur booléenne qui indique si le programme (autre que Si Si | Cela indique que |
Création de l'espace de noms de l'éditeur de liens
Dans Android 11, la configuration de l'éditeur de liens est créée lors de l'exécution sous /linkerconfig
au lieu d'utiliser des fichiers en texte brut dans ${android-src}/system/core/rootdir/etc
. La configuration est générée au démarrage en fonction de l'environnement d'exécution, qui comprend les éléments suivants :
- Si l'appareil prend en charge VNDK
- Version VNDK cible de la partition fournisseur
- Version VNDK de la partition produit
- Modules APEX installés
La configuration de l'éditeur de liens est créée en résolvant les dépendances entre les espaces de noms de l'éditeur de liens. Par exemple, s'il existe des mises à jour sur les modules APEX qui incluent des mises à jour de dépendance, la configuration de l'éditeur de liens est générée pour refléter ces modifications. Plus de détails pour créer la configuration de l'éditeur de liens peuvent être trouvés dans ${android-src}/system/linkerconfig
.
Isolement de l'espace de noms de l'éditeur de liens
Il existe trois types de configuration. En fonction de la valeur de PRODUCT_TREBLE_LINKER_NAMESPACES
et BOARD_VNDK_VERSION
dans BoardConfig.mk
, la configuration correspondante est générée au démarrage.
PRODUCT_TREBLE_ LINKER_NAMESPACES | BOARD_VNDK_ VERSION | Configuration sélectionnée | Exigence VTS |
---|---|---|---|
true | current | VNDK | Obligatoire pour les appareils lancés avec Android 9 ou supérieur |
Vide | VNDK Lite | Obligatoire pour les appareils lancés avec Android 8.x | |
false | Vide | Legacy | Pour les appareils non Treble |
La configuration de VNDK Lite isole les bibliothèques partagées SP-HAL et VNDK-SP. Dans Android 8.0, il doit s'agir du fichier de configuration de l'éditeur de liens dynamique lorsque PRODUCT_TREBLE_LINKER_NAMESPACES
est true
.
La configuration VNDK isole également les bibliothèques partagées SP-HAL et VNDK-SP. De plus, cette configuration fournit l'isolation complète de l'éditeur de liens dynamique. Cela garantit que les modules de la partition système ne dépendront pas des bibliothèques partagées dans les partitions du fournisseur et vice versa.
Dans Android 8.1 ou supérieur, la configuration VNDK est la configuration par défaut et il est fortement recommandé d'activer l'isolation complète de l'éditeur de liens dynamique en définissant BOARD_VNDK_VERSION
sur current
.
Configuration VNDK
La configuration VNDK isole les dépendances de la bibliothèque partagée entre la partition système et les partitions du fournisseur. Par rapport aux configurations mentionnées dans la sous-section précédente, les différences sont décrites comme suit :
Processus cadre
- Les espaces de noms
default
,vndk
,sphal
etrs
sont créés. - Tous les espaces de noms sont isolés.
- Les bibliothèques partagées du système sont chargées dans l'espace de noms
default
. - Les SP-HAL sont chargés dans l'espace de noms
sphal
. - Bibliothèques partagées VNDK-SP chargées dans l'espace de noms
vndk
.
- Les espaces de noms
Processus fournisseur
- Les espaces de noms
default
,vndk
etsystem
sont créés. - L'espace de noms
default
est isolé. - Les bibliothèques partagées du fournisseur sont chargées dans l'espace de noms
default
. - Les bibliothèques partagées VNDK et VNDK-SP sont chargées dans l'espace de noms
vndk
. - LL-NDK et ses dépendances sont chargés dans l'espace de noms du
system
.
- Les espaces de noms
La relation entre les espaces de noms de l'éditeur de liens est illustrée ci-dessous.

Dans l'image ci-dessus, LL-NDK et VNDK-SP représentent les bibliothèques partagées suivantes :
- LL-NDK
-
libEGL.so
-
libGLESv1_CM.so
-
libGLESv2.so
-
libGLESv3.so
-
libandroid_net.so
-
libc.so
-
libdl.so
-
liblog.so
-
libm.so
-
libnativewindow.so
-
libneuralnetworks.so
-
libsync.so
-
libvndksupport.so
-
libvulkan.so
-
- VNDK-SP
-
android.hardware.graphics.common@1.0.so
-
android.hardware.graphics.mapper@2.0.so
-
android.hardware.renderscript@1.0.so
-
android.hidl.memory@1.0.so
-
libRSCpuRef.so
-
libRSDriver.so
-
libRS_internal.so
-
libbase.so
-
libbcinfo.so
-
libc++.so
-
libcutils.so
-
libhardware.so
-
libhidlbase.so
-
libhidlmemory.so
-
libhidltransport.so
-
libhwbinder.so
-
libion.so
-
libutils.so
-
libz.so
-
Vous pouvez trouver plus de détails dans /linkerconfig/ld.config.txt
à partir de l'appareil.
Configuration VNDK Lite
À partir d'Android 8.0, l'éditeur de liens dynamique est configuré pour isoler les bibliothèques partagées SP-HAL et VNDK-SP de sorte que leurs symboles n'entrent pas en conflit avec d'autres bibliothèques partagées du framework. La relation entre les espaces de noms de l'éditeur de liens est illustrée ci-dessous.

LL-NDK et VNDK-SP représentent les bibliothèques partagées suivantes :
- LL-NDK
-
libEGL.so
-
libGLESv1_CM.so
-
libGLESv2.so
-
libc.so
-
libdl.so
-
liblog.so
-
libm.so
-
libnativewindow.so
-
libstdc++.so
(pas dans la configuration) -
libsync.so
-
libvndksupport.so
-
libz.so
(déplacé vers VNDK-SP dans la configuration)
-
- VNDK-SP
-
android.hardware.graphics.common@1.0.so
-
android.hardware.graphics.mapper@2.0.so
-
android.hardware.renderscript@1.0.so
-
android.hidl.memory@1.0.so
-
libbase.so
-
libc++.so
-
libcutils.so
-
libhardware.so
-
libhidlbase.so
-
libhidlmemory.so
-
libhidltransport.so
-
libhwbinder.so
-
libion.so
-
libutils.so
-
Le tableau ci-dessous répertorie la configuration des espaces de noms pour les processus de structure, qui est extraite de la section [system]
de la configuration VNDK Lite.
Espace de noms | Propriété | Valeur |
---|---|---|
default | search.paths | /system/${LIB} /odm/${LIB} /vendor/${LIB} /product/${LIB} |
isolated | false | |
sphal | search.paths | /odm/${LIB} /vendor/${LIB} |
permitted.paths | /odm/${LIB} /vendor/${LIB} | |
isolated | true | |
visible | true | |
links | default,vndk,rs | |
link.default.shared_libs | LL-NDK | |
link.vndk.shared_libs | VNDK-SP | |
link.rs.shared_libs | libRS_internal.so | |
vndk (pour VNDK-SP) | search.paths | /odm/${LIB}/vndk-sp /vendor/${LIB}/vndk-sp /system/${LIB}/vndk-sp-${VER} |
permitted.paths | /odm/${LIB}/hw /odm/${LIB}/egl /vendor/${LIB}/hw /vendor/${LIB}/egl /system/${LIB}/vndk-sp-${VER}/hw | |
isolated | true | |
visible | true | |
links | default | |
link.default.shared_libs | LL-NDK | |
rs (pour RenderScript) | search.paths | /odm/${LIB}/vndk-sp /vendor/${LIB}/vndk-sp /system/${LIB}/vndk-sp-${VER} /odm/${LIB} /vendor/${LIB} |
permitted.paths | /odm/${LIB} /vendor/${LIB} /data (pour le noyau RS compilé) | |
isolated | true | |
visible | true | |
links | default,vndk | |
link.default.shared_libs | LL-NDKlibmediandk.so libft2.so | |
link.vndk.shared_libs | VNDK-SP |
Le tableau ci-dessous présente la configuration des espaces de noms pour les processus du fournisseur, extraite de la section [vendor]
de la configuration VNDK Lite.
Espace de noms | Propriété | Valeur |
---|---|---|
default | search.paths | /odm/${LIB} /odm/${LIB}/vndk /odm/${LIB}/vndk-sp /vendor/${LIB} /vendor/${LIB}/vndk /vendor/${LIB}/vndk-sp /system/${LIB}/vndk-${VER} /system/${LIB}/vndk-sp-${VER} /system/${LIB} (obsolète)/product/${LIB} (obsolète) |
isolated | false |
Plus de détails peuvent être trouvés dans /linkerconfig/ld.config.txt
à partir de l'appareil.
Historique du document
Modifications d'Android 11
- Dans Android 11, les fichiers statiques
ld.config.*.txt
sont supprimés de la base de code et LinkerConfig les génère lors de l'exécution à la place.
Android 9 change
- Dans Android 9, l'espace de noms de l'éditeur de liens
vndk
est ajouté aux processus du fournisseur et les bibliothèques partagées VNDK sont isolées de l'espace de noms de l'éditeur de liens par défaut. - Remplacez
PRODUCT_FULL_TREBLE
par desPRODUCT_TREBLE_LINKER_NAMESPACES
plus spécifiques. - Android 9 modifie les noms des fichiers de configuration de l'éditeur de liens dynamique suivants.
Android 8.x Androïde 9 La description ld.config.txt.in
ld.config.txt
Pour les appareils avec isolation de l'espace de noms de l'éditeur de liens d'exécution ld.config.txt
ld.config.vndk_lite.txt
Pour les appareils avec isolation de l'espace de noms de l'éditeur de liens VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
Pour les appareils hérités exécutant Android 7.x ou une version antérieure - Supprimez
android.hardware.graphics.allocator@2.0.so
. - les partitions
product
etodm
sont ajoutées.