L'éditeur de liens dynamique relève deux défis de la conception du VNDK Treble:
- Bibliothèques partagées SP-HAL et leurs dépendances, y compris VNDK-SP bibliothèques, sont chargées dans des processus de framework. Il devrait y avoir pour éviter les conflits de symboles.
dlopen()
etandroid_dlopen_ext()
peuvent introduire certaines dépendances d'exécution qui ne sont pas visibles au moment de la compilation et peuvent être difficiles à détecter à l'aide d'une analyse statique.
L'espace de noms Linker permet de résoudre ces deux problèmes. sur le mécanisme d'attention. Ce mécanisme est fourni par l'éditeur de liens dynamique. Il vous pouvez isoler les bibliothèques partagées dans différents espaces de noms de l'éditeur de liens, Les bibliothèques ayant le même nom de bibliothèque, mais avec des symboles différents n'entreront pas en conflit.
D'autre part, le mécanisme d'espace de noms de l'éditeur de liens offre la flexibilité nécessaire afin 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 de l'éditeur de liens. Ces bibliothèques partagées exportées peuvent interfaces de programmation d'application publiques pour d'autres programmes tout en en masquant les détails de leur implémentation dans leur espace de noms de l'éditeur de liens.
Par exemple, /system/lib[64]/libcutils.so
et
/system/lib[64]/vndk-sp-${VER}/libcutils.so
sont deux partagés
bibliothèques. Ces deux bibliothèques peuvent avoir des symboles différents. Elles sont chargées
dans différents espaces de noms de l'éditeur de liens, de sorte que les modules du framework puissent dépendre
Les bibliothèques partagées /system/lib[64]/libcutils.so
et SP-HAL peuvent
dépend de /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
En revanche, /system/lib[64]/libc.so
est un exemple de
Une bibliothèque publique exportée par un espace de noms d'éditeur de liens et importée dans
de nombreux espaces de noms. Les dépendances de
/system/lib[64]/libc.so
, par exemple libnetd_client.so
,
sont chargées dans l'espace de noms dans lequel /system/lib[64]/libc.so
se trouve. Les autres espaces de noms n'auront pas accès à ces dépendances. Ce
encapsule les détails de l'implémentation tout en fournissant au public
de commande.
Fonctionnement
L'éditeur de liens dynamiques charge les bibliothèques partagées spécifiées
dans les entrées DT_NEEDED
ou dans les bibliothèques partagées spécifiées par
l'argument dlopen()
ou android_dlopen_ext()
. Dans les deux
dans ce cas, l'éditeur de liens dynamique trouve l'espace de noms de l'éditeur de liens dans lequel l'appelant
réside 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'éditeur de liens spécifié.
il demande à l'espace de noms de l'éditeur de liens associé le nom de l'éditeur partagé
bibliothèques.
Format du fichier de configuration
Le format du fichier de configuration est basé sur le format de fichier INI. Une configuration type de configuration Terraform se présente comme suit:
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 les éléments suivants:
- Plusieurs propriétés de mappage de sections de répertoire au début du fichier dynamique pour sélectionner la section efficace.
-
Plusieurs sections de configuration des espaces de noms Linker:
<ph type="x-smartling-placeholder">
- </ph>
- Chaque section contient plusieurs espaces de noms (sommets de graphique) et plusieurs Liens de remplacement entre les espaces de noms (arcs de graphique).
- Chaque espace de noms possède sa propre isolation, ses chemins de recherche, ses chemins autorisés, et les paramètres de visibilité.
Les tableaux ci-dessous décrivent chaque propriété en détail.
Propriété de mappage de section de répertoire
Propriété | Description | Exemple |
---|---|---|
|
Un chemin d'accès à un répertoire que la section Chaque propriété mappe les exécutables du répertoire sur un éditeur de liens.
de configuration des espaces de noms. Il peut y avoir deux propriétés (ou plus)
qui ont le même |
Cela indique que la configuration spécifiée dans le
La section La configuration spécifiée dans la section |
Propriétés de la relation
Propriété | Description | Exemple |
---|---|---|
additional. |
Liste d'espaces de noms supplémentaires séparés par une virgule (en plus des
|
Cela indique qu'il existe trois espaces de noms ( |
namespace. |
Liste d'espaces de noms de remplacement séparés par une virgule. Si aucune bibliothèque partagée est introuvable dans l'espace de noms actuel, la classe dynamique linker tente de charger la bibliothèque partagée à partir des espaces de noms de remplacement. La 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é dans l'espace de noms Si la bibliothèque partagée ne peut pas être chargée
Enfin, si toutes les tentatives échouent, l'éditeur de liens dynamique renvoie une erreur. |
namespace. |
Liste de bibliothèques partagées séparées par un signe deux-points dans lesquelles les internautes peuvent effectuer des recherches
Les espaces de noms Impossible d'utiliser cette propriété avec
|
Cela indique que le lien de remplacement n'accepte que |
namespace. |
Valeur booléenne indiquant si toutes les bibliothèques partagées peuvent être
recherchées dans l'espace de noms Impossible d'utiliser cette propriété avec
|
Cela indique que tous les noms de bibliothèques peuvent passer par le lien de remplacement.
de |
Propriétés de l'espace de noms
Propriété | Description | Exemple |
---|---|---|
namespace. |
Valeur booléenne indiquant si l'éditeur de liens dynamique doit vérifier où se trouve la bibliothèque partagée. Si Si |
Cela indique que seules
les bibliothèques partagées dans
|
namespace. |
Liste de répertoires séparés par un signe deux-points à rechercher dans les répertoires partagés bibliothèques. Les répertoires spécifiés dans Lorsque Par exemple, si |
Cela indique que l'éditeur de liens dynamiques recherche
|
namespace. |
Liste de répertoires séparés par un signe deux-points dans lesquels rechercher des bibliothèques partagées lorsque AddressSanitizer (ASan) est activé.
|
Cela indique que lorsque
ASan est activé
l'éditeur de liens dynamiques recherche d'abord |
namespace. |
Une liste de répertoires (y compris les sous-répertoires) séparés par le signe deux-points, où
l'éditeur de liens dynamiques peut charger les bibliothèques partagées (en plus
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. |
Liste des répertoires, séparés par un signe deux-points, dans lesquels l'éditeur de liens dynamique peut être chargé les bibliothèques partagées lorsque ASan est activé.
|
Cela indique que lorsque ASan est activé
des bibliothèques partagées sous |
namespace. |
Valeur booléenne indiquant si le programme (autre que
Si Si |
Cela indique que |
Création d'un espace de noms Linker
Dans Android 11, la configuration de l'éditeur de liens est créée au moment 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, ce qui inclut les éléments suivants:
- Si l'appareil est compatible avec le VNDK
- Version du VNDK cible de la partition du fournisseur
- Version VNDK de la partition de produits
- 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. Pour
Par exemple, s'il existe des mises à jour des modules APEX incluant des mises à jour de dépendances,
est générée pour refléter ces modifications. Plus de détails pour créer une configuration Linker
se trouvent dans
${android-src}/system/linkerconfig
Isolation de l'espace de noms Linker
Il existe trois types de configuration. En fonction de la valeur de
PRODUCT_TREBLE_LINKER_NAMESPACES
et
BOARD_VNDK_VERSION
dans BoardConfig.mk
, les
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 version ultérieure |
Vide | VNDK Lite |
Obligatoire pour les appareils lancés avec Android 8.x | |
false |
Vide | Legacy |
Pour les appareils non aigus |
La configuration VNDK Lite isole les bibliothèques partagées SP-HAL et VNDK-SP. Sous Android 8.0, cette
doit être le fichier de configuration de l'éditeur de liens dynamique
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 totale de l'éditeur de liens dynamique. Il garantit que les modules de la partition système ne dépendent pas du bibliothèques dans les partitions du fournisseur et vice versa.
Sur Android 8.1 ou version ultérieure, la configuration VNDK est la configuration par défaut
Nous vous recommandons vivement d'activer l'isolation complète de l'éditeur de liens dynamiques
De BOARD_VNDK_VERSION
à current
.
Configuration VNDK
<ph type="x-smartling-placeholder">La configuration VNDK isole les dépendances de la bibliothèque partagée entre la partition du système et les partitions du fournisseur. Par rapport à mentionnées dans la sous-section précédente, les différences sont décrits comme suit:
-
Processus de framework
default
,vndk
Les espaces de nomssphal
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 ressources SP-HAL sont chargées dans l'espace de noms
sphal
. - Les bibliothèques partagées VNDK-SP ont été chargées dans l'espace de noms
vndk
.
-
Processus pour les fournisseurs
- Les espaces de noms
default
,vndk
etsystem
sont créés. - L'espace de noms
default
est isolé. - Les bibliothèques partagées des fournisseurs 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
. - Le NDK et ses dépendances sont chargés dans l'espace de noms
system
.
- Les espaces de noms
La relation entre les espaces de noms de l'éditeur de liens est illustrée ci-dessous.
![Graphique de l'espace de noms Linker décrit dans la configuration VNDK](https://source.android.com/static/docs/core/architecture/images/treble_vndk_linker_namespace3.png?authuser=2&hl=fr)
Figure 1 : Isolation de l'espace de noms Linker (configuration VNDK).
Dans l'image ci-dessus, LL-NDK et VNDK-SP correspondent à bibliothèques partagées:
-
LL-NDK
<ph type="x-smartling-placeholder">
- </ph>
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
<ph type="x-smartling-placeholder">
- </ph>
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 trouverez plus d'informations dans /linkerconfig/ld.config.txt
depuis l'appareil.
Configuration de VNDK Lite
À partir d'Android 8.0, l'éditeur de liens dynamique est configuré pour isoler le SP-HAL et les bibliothèques partagées du 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 comme indiqué ci-dessous.
![Graphique de l'espace de noms Linker décrit dans la configuration de VNDK Lite](https://source.android.com/static/docs/core/architecture/images/treble_vndk_linker_namespace1.png?authuser=2&hl=fr)
LL-NDK et VNDK-SP désignent les bibliothèques partagées suivantes:
-
LL-NDK
<ph type="x-smartling-placeholder">
- </ph>
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
<ph type="x-smartling-placeholder">
- </ph>
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 le framework
des processus, extrait de la section [system]
la configuration de 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 des fournisseurs,
extrait de la section [vendor]
la configuration de 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 |
Pour en savoir plus, consultez /linkerconfig/ld.config.txt
sur l'appareil.
Historique du document
Modifications apportées à Android 11
- Dans Android 11, les fichiers
ld.config.*.txt
statiques sont du codebase. LinkerConfig les génère à la place dans l'environnement d'exécution.
Modifications apportées à Android 9
- Sous Android 9, l'espace de noms Linker
vndk
est ajouté au fournisseur les processus et les bibliothèques partagées VNDK sont isolés de l'éditeur de liens par défaut. espace de noms. - Remplacer
PRODUCT_FULL_TREBLE
par une valeur plus spécifiquePRODUCT_TREBLE_LINKER_NAMESPACES
- Android 9 modifie le nom de la configuration de l'éditeur dynamique suivante :
.
Android 8.x Android 9 Description ld.config.txt.in
ld.config.txt
Pour les appareils avec isolation d'espace de noms de l'éditeur de liens d'exécution ld.config.txt
ld.config.vndk_lite.txt
Pour les appareils dotés de l'isolation d'espace de noms de l'éditeur de liens VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
Pour les anciens appareils équipés d'Android 7.x ou version antérieure - Supprimez
android.hardware.graphics.allocator@2.0.so
. - Les partitions
product
etodm
sont ajoutées.