Der dynamische Linker löst zwei Herausforderungen beim Treble VNDK-Design:
- Gemeinsam genutzte SP-HAL-Bibliotheken und ihre Abhängigkeiten, einschließlich VNDK-SP-Bibliotheken, werden in Framework-Prozesse geladen. Es sollte Mechanismen geben, um Symbolkonflikte zu vermeiden.
dlopen()
undandroid_dlopen_ext()
können einige Laufzeitabhängigkeiten einführen, die zur Buildzeit nicht sichtbar sind und mithilfe einer statischen Analyse nur schwer zu erkennen sind.
Diese beiden Probleme können mit dem Linker-Namespace gelöst werden. Dieser Mechanismus wird vom dynamischen Linker bereitgestellt. Es kann die freigegebenen Bibliotheken in verschiedenen Linker-Namespaces unterbringen, damit Bibliotheken mit demselben Bibliotheksnamen, aber unterschiedlichen Symbolen, nicht in Konflikt stehen.
Andererseits bietet der Linker-Namespace-Mechanismus die Flexibilität, dass einige freigegebene Bibliotheken von einem Linker-Namespace exportiert und von einem anderen Linker-Namespace verwendet werden können. Diese exportierten freigegebenen Bibliotheken können zu Anwendungsprogrammierschnittstellen werden, die für andere Programme öffentlich sind, während ihre Implementierungsdetails in ihren Linker-Namespaces ausgeblendet werden.
Beispiel: /system/lib[64]/libcutils.so
und /system/lib[64]/vndk-sp-${VER}/libcutils.so
sind zwei freigegebene Bibliotheken. Diese beiden Bibliotheken können unterschiedliche Symbole haben. Sie werden in verschiedene Verknüpfungs-Namespaces geladen, sodass Framework-Module von /system/lib[64]/libcutils.so
abhängen können und gemeinsam genutzte SP-HAL-Bibliotheken von /system/lib[64]/vndk-sp-${VER}/libcutils.so
abhängig sind.
/system/lib[64]/libc.so
hingegen ist ein Beispiel für eine öffentliche Bibliothek, die von einem Verknüpfungs-Namespace exportiert und in viele Verknüpfungs-Namespaces importiert wird. Die Abhängigkeiten von /system/lib[64]/libc.so
, z. B. libnetd_client.so
, werden in den Namespace geladen, in dem sich /system/lib[64]/libc.so
befindet. Andere Namespaces haben keinen Zugriff auf diese Abhängigkeiten. Dieser Mechanismus kapselt die Implementierungsdetails ein und stellt gleichzeitig die öffentlichen Schnittstellen bereit.
Funktionsweise
Der dynamische Linker ist für das Laden der in DT_NEEDED
-Einträgen angegebenen oder der über das Argument von dlopen()
oder android_dlopen_ext()
angegebenen gemeinsam genutzten Bibliotheken verantwortlich. In beiden Fällen sucht der dynamische Linker den Linker-Namespace, in dem sich der Aufrufer befindet, und versucht, die Abhängigkeiten in denselben Linker-Namespace zu laden. Wenn die dynamische Verknüpfung die gemeinsam genutzte Bibliothek nicht in den angegebenen Linker-Namespace laden kann, werden beim verknüpften Verknüpfungs-Namespace exportierte freigegebene Bibliotheken angefordert.
Format der Konfigurationsdatei
Das Konfigurationsdateiformat basiert auf dem INI-Dateiformat. Eine typische Konfigurationsdatei sieht so aus:
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}
Die Konfigurationsdatei enthält Folgendes:
- Mehrere Eigenschaften für die Zuordnung von Verzeichnisabschnitten am Anfang, damit der dynamische Linker den effektiven Abschnitt auswählen kann.
-
Mehrere Konfigurationsabschnitte für Linker-Namespaces:
- Jeder Abschnitt enthält mehrere Namespaces (Graphknoten) und mehrere Fallback-Links zwischen Namespaces (Graphbögen).
- Jeder Namespace hat eigene Einstellungen für Isolierung, Suchpfade, zulässige Pfade und Sichtbarkeit.
In den folgenden Tabellen wird die Bedeutung der einzelnen Properties ausführlich beschrieben.
Property für die Zuordnung von Verzeichnisbereichen
Attribut | Beschreibung | Verwendungsbeispiele |
---|---|---|
|
Ein Pfad zu einem Verzeichnis, für das der Abschnitt Jede Eigenschaft ordnet die ausführbaren Dateien im Verzeichnis einem Konfigurationsabschnitt für Linker-Namespaces zu. Möglicherweise gibt es zwei oder mehr Properties mit derselben |
Das bedeutet, dass die im Abschnitt Die im Abschnitt |
Beziehungsattribute
Attribut | Beschreibung | Verwendungsbeispiele |
---|---|---|
additional. |
Eine durch Kommas getrennte Liste mit zusätzlichen Namespaces (zusätzlich zum Namespace |
Das bedeutet, dass die |
namespace. |
Eine durch Kommas getrennte Liste von Fallback-Namespaces. Wenn eine freigegebene Bibliothek im aktuellen Namespace nicht gefunden werden kann, versucht der dynamische Linker, die freigegebene Bibliothek aus den Fallback-Namespaces zu laden. Der am Anfang der Liste angegebene Namespace hat eine höhere Priorität. |
Wenn eine gemeinsam genutzte Bibliothek oder eine ausführbare Datei eine gemeinsam genutzte Bibliothek anfordert, die nicht in den Namespace Wenn die gemeinsam genutzte Bibliothek auch nicht aus dem Namespace Wenn alle Versuche fehlschlagen, gibt der dynamische Linker einen Fehler zurück. |
namespace. |
Eine durch Doppelpunkte getrennte Liste von freigegebenen Bibliotheken, in denen nach diesen Bibliotheken gesucht werden kann, wenn sie nicht im Dieses Attribut kann nicht mit |
Das bedeutet, dass für den Fallback-Link nur |
namespace. |
Ein boolescher Wert, der angibt, ob alle freigegebenen Bibliotheken im Namespace Diese Property kann nicht mit |
Das bedeutet, dass alle Bibliotheksnamen über die Fallback-Verknüpfung vom Namespace |
Namespace-Eigenschaften
Attribut | Beschreibung | Verwendungsbeispiele |
---|---|---|
namespace. |
Ein boolescher Wert, der angibt, ob der dynamische Linker prüfen soll, wo sich die freigegebene Bibliothek befindet. Wenn Wenn |
Das bedeutet, dass nur die freigegebenen Bibliotheken in |
namespace. |
Eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen nach gemeinsam genutzten Bibliotheken gesucht werden soll. Die in Wenn Beispiel: Wenn |
Das bedeutet, dass der dynamische Linker in |
namespace. |
Eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen nach freigegebenen Bibliotheken gesucht werden soll, wenn AddressSanitizer (ASan) aktiviert ist.
|
Das bedeutet, dass der dynamische Linker bei aktiviertem ASan zuerst |
namespace. |
Eine durch Doppelpunkte getrennte Liste von Verzeichnissen (einschließlich Unterverzeichnissen), in denen der dynamische Linker die freigegebenen Bibliotheken (zusätzlich zu Auch die gemeinsam genutzten Bibliotheken in den Unterverzeichnissen von Wenn |
Das bedeutet, dass die freigegebenen Bibliotheken unter Ohne |
namespace. |
Eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen die dynamische Verknüpfung die gemeinsam genutzten Bibliotheken laden kann, wenn ASan aktiviert ist.
|
Wenn ASan aktiviert ist, können freigegebene Bibliotheken unter |
namespace. |
Ein boolescher Wert, der angibt, ob das Programm (außer Wenn Wenn |
Das bedeutet, dass |
Linker-Namespace erstellen
In Android 11 wird die Linkerkonfiguration zur Laufzeit unter /linkerconfig
erstellt, anstatt Textdateien in ${android-src}/system/core/rootdir/etc
zu verwenden. Die Konfiguration wird beim Starten basierend auf der Laufzeitumgebung generiert. Diese umfasst die folgenden Elemente:
- Wenn das Gerät VNDK unterstützt
- Ziel-VNDK-Version der Anbieterpartition
- VNDK-Version der Produktpartition
- Installierte APEX-Module
Die Linker-Konfiguration wird durch Auflösen von Abhängigkeiten zwischen Linker-Namespaces erstellt. Wenn es beispielsweise Updates für die APEX-Module gibt, die Abhängigkeitsupdates enthalten, wird eine Linkerkonfiguration generiert, die diese Änderungen widerspiegelt. Weitere Informationen zum Erstellen einer Linker-Konfiguration finden Sie unter ${android-src}/system/linkerconfig
.
Isolation des Linker-Namespace
Es gibt drei Konfigurationstypen. Abhängig vom Wert von PRODUCT_TREBLE_LINKER_NAMESPACES
und BOARD_VNDK_VERSION
in BoardConfig.mk
wird die entsprechende Konfiguration beim Booten generiert.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
Ausgewählte Konfiguration | VTS-Anforderung |
---|---|---|---|
true |
current |
VNDK |
Obligatorisch für Geräte mit Android 9 oder höher |
Leer | VNDK Lite |
Erforderlich für Geräte, die mit Android 8.x auf den Markt gebracht wurden | |
false |
Leer | Legacy |
Für Geräte ohne Treble |
Bei der VNDK Lite-Konfiguration werden die freigegebenen SP-HAL- und VNDK-SP-Bibliotheken isoliert. In Android 8.0 muss dies die Konfigurationsdatei für dynamische Verknüpfung sein, wenn PRODUCT_TREBLE_LINKER_NAMESPACES
den Wert true
hat.
Die VNDK-Konfiguration isoliert auch die SP-HAL- und VNDK-SP-gemeinsam genutzten Bibliotheken. Außerdem bietet diese Konfiguration die vollständige Isolation des dynamischen Linker. So wird sichergestellt, dass Module in der Systempartition nicht von den freigegebenen Bibliotheken in den Anbieterpartitionen abhängen und umgekehrt.
Ab Android 8.1 ist die VNDK-Konfiguration die Standardkonfiguration. Es wird dringend empfohlen, die vollständige Isolierung von dynamischen Links zu aktivieren, indem Sie BOARD_VNDK_VERSION
auf current
setzen.
VNDK-Konfiguration
Die VNDK-Konfiguration isoliert die Abhängigkeiten der freigegebenen Bibliothek zwischen der Systempartition und den Anbieterpartitionen. Im Vergleich zu den im vorherigen Unterabschnitt beschriebenen Konfigurationen sind die Unterschiede so:
-
Framework-Prozesse
- Die Namespaces
default
,vndk
,sphal
undrs
werden erstellt. - Alle Namespaces sind isoliert.
- Gemeinsam genutzte Systembibliotheken werden in den Namespace
default
geladen. - SP-HALs werden in den Namespace
sphal
geladen. - In den Namespace
vndk
geladene freigegebene VNDK-SP-Bibliotheken.
- Die Namespaces
-
Zulieferunternehmen
- Die Namespaces
default
,vndk
undsystem
werden erstellt. - Der Namespace
default
ist isoliert. - Vom Anbieter freigegebene Bibliotheken werden in den Namespace
default
geladen. - VNDK- und VNDK-SP-gemeinsam genutzte Bibliotheken werden in den Namespace
vndk
geladen. - LL-NDK und seine Abhängigkeiten werden in den Namespace
system
geladen.
- Die Namespaces
Die Beziehung zwischen den Verknüpfungs-Namespaces ist unten dargestellt.
Abbildung 1. Linker-Namespace-Isolation (VNDK-Konfiguration)
In der Abbildung oben stehen LL-NDK und VNDK-SP für die folgenden freigegebenen Bibliotheken:
-
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
Weitere Details findest du auf dem Gerät unter /linkerconfig/ld.config.txt
.
VNDK Lite-Konfiguration
Ab Android 8.0 ist der dynamische Linker so konfiguriert, dass die SP-HAL- und VNDK-SP-gemeinsam genutzten Bibliotheken so isoliert werden, dass ihre Symbole nicht mit anderen gemeinsam genutzten Framework-Bibliotheken in Konflikt stehen. Die Beziehung zwischen den Linker-Namespaces ist unten dargestellt.
LL-NDK und VNDK-SP stehen für die folgenden freigegebenen Bibliotheken:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libstdc++.so
(nicht in der Konfiguration)libsync.so
libvndksupport.so
libz.so
(in der Konfiguration zu VNDK-SP verschoben)
-
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
In der folgenden Tabelle ist die Namespace-Konfiguration für Framework-Prozesse aufgeführt, die aus dem Abschnitt [system]
der VNDK Lite-Konfiguration entnommen ist.
Namespace | Attribut | Wert |
---|---|---|
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 (für 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 (für 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 (für kompilierten RS-Kernel)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.so libft2.so
|
|
link.vndk.shared_libs |
VNDK-SP |
In der folgenden Tabelle ist die Namespacekonfiguration für Anbieterprozesse zu sehen. Sie ist ein Auszug aus dem Abschnitt [vendor]
in der VNDK Lite-Konfiguration.
Namensraum | Attribut | Wert |
---|---|---|
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} (verworfen)/product/${LIB} (verworfen)
|
isolated |
false |
Weitere Details findest du auf dem Gerät unter /linkerconfig/ld.config.txt
.
Dokumentverlauf
Änderungen bei Android 11
- In Android 11 werden die statischen
ld.config.*.txt
-Dateien aus der Codebasis entfernt und stattdessen von LinkerConfig in der Laufzeit generiert.
Änderungen bei Android 9
- In Android 9 wird der
vndk
-Linker-Namespace zu Anbieterprozessen hinzugefügt und VNDK-gemeinsam genutzte Bibliotheken werden vom Standard-Linker-Namespace isoliert. - Ersetzen Sie
PRODUCT_FULL_TREBLE
durch einen spezifischeren MesswertPRODUCT_TREBLE_LINKER_NAMESPACES
. - In Android 9 werden die Namen der folgenden Konfigurationsdateien des dynamischen Linker geändert.
Android 8.x Android 9 Beschreibung ld.config.txt.in
ld.config.txt
Für Geräte mit der Namespace-Isolierung zur Laufzeitverknüpfung ld.config.txt
ld.config.vndk_lite.txt
Für Geräte mit VNDK-SP-Linker-Namespace-Isolation ld.config.legacy.txt
ld.config.legacy.txt
Für ältere Geräte mit Android 7.x oder niedriger - Entfernen Sie
android.hardware.graphics.allocator@2.0.so
. - Die Partitionen
product
undodm
werden hinzugefügt.