Il linker dinamico risolve due problemi nel design di Treble VNDK:
- Le librerie condivise SP-HAL e le relative dipendenze, incluse le librerie VNDK-SP, vengono caricate nei processi del framework. Dovrebbero esserci alcuni meccanismi per evitare conflitti di simboli.
dlopen()
eandroid_dlopen_ext()
possono introdurre alcune dipendenze di runtime non visibili al momento della compilazione e possono essere difficili da rilevare utilizzando l'analisi statica.
Questi due problemi possono essere risolti dal meccanismo dello spazio dei nomi del linker. Questo meccanismo è fornito dal linker dinamico. Puoi isolerare le librerie condivise in spazi dei nomi del linker diversi in modo che le librerie con lo stesso nome, ma con simboli diversi, non entrino in conflitto.
D'altra parte, il meccanismo dello spazio dei nomi del linker offre la flessibilità necessaria per consentire a alcune librerie condivise di essere esportate da uno spazio dei nomi del linker e utilizzate da un altro spazio dei nomi del linker. Queste librerie condivise esportate possono diventare API di programmazione di applicazioni pubbliche per altri programmi, nascondendo al contempo i dettagli di implementazione all'interno degli spazi dei nomi del linker.
Ad esempio, /system/lib[64]/libcutils.so
e
/system/lib[64]/vndk-sp-${VER}/libcutils.so
sono due librerie
condivise. Queste due librerie possono avere simboli diversi. Vengono caricati
in diversi spazi dei nomi del linker in modo che i moduli del framework possano dipendere da
/system/lib[64]/libcutils.so
e le librerie condivise SP-HAL possano
dipendere da /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
D'altra parte, /system/lib[64]/libc.so
è un esempio di biblioteca pubblica esportata da uno spazio dei nomi del linker e importata in molti spazi dei nomi del linker. Le dipendenze di /system/lib[64]/libc.so
, ad esempio libnetd_client.so
, vengono caricate nello spazio dei nomi in cui risiede /system/lib[64]/libc.so
. Gli altri spazi dei nomi non avranno accesso a queste dipendenze. Questo
meccanismo incapsula i dettagli di implementazione, fornendo al contempo le interfacce
pubbliche.
Come funziona
Il linker dinamico è responsabile del caricamento delle librerie condivise specificate nelle voci DT_NEEDED
o delle librerie condivise specificate dall'argomento di dlopen()
o android_dlopen_ext()
. In entrambi i casi, il linker dinamico trova lo spazio dei nomi del linker in cui risiede il chiamante e tenta di caricare le dipendenze nello stesso spazio dei nomi del linker. Se il linker dinamico non riesce a caricare la libreria condivisa nello spazio dei nomi del linker specificato, chiede allo spazio dei nomi del linker collegato le librerie condivise esportate.
Formato del file di configurazione
Il formato del file di configurazione si basa sul formato del file INI. Un tipico file di configurazione ha il seguente aspetto:
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}
Il file di configurazione include:
- Diverse proprietà di mappatura delle directory all'inizio per consentire al linker dinamico di selezionare la sezione effettiva.
-
Diverse sezioni di configurazione degli spazi dei nomi del linker:
- Ogni sezione contiene diversi spazi dei nomi (vertici del grafico) e diversi link di riserva tra gli spazi dei nomi (archi del grafico).
- Ogni spazio dei nomi ha i propri percorsi di isolamento, di ricerca, consentiti e di visibilità.
Le tabelle seguenti descrivono in dettaglio il significato di ogni proprietà.
Proprietà di mappatura della sezione della directory
Proprietà | Descrizione | Esempio |
---|---|---|
|
Un percorso a una directory a cui si applica la sezione Ogni proprietà mappa gli eseguibili nella directory a una sezione di configurazione degli spazi dei nomi del linker. Potrebbero esserci due (o più) proprietà
che hanno lo stesso |
Ciò indica che la configurazione specificata nella sezione La configurazione specificata nella sezione |
Proprietà della relazione
Proprietà | Descrizione | Esempio |
---|---|---|
additional. |
Un elenco di spazi dei nomi aggiuntivi separati da virgole (oltre allo spazio dei nomi |
Ciò indica che nella configurazione |
namespace. |
Un elenco separato da virgole di spazi dei nomi di riserva. Se non è possibile trovare una libreria condivisa nello spazio dei nomi corrente, il linker dinamico tenta di caricarla dagli spazi dei nomi di riserva. Lo spazio dei nomi specificato all'inizio dell'elenco ha una priorità maggiore. |
Se una libreria condivisa o un file eseguibile richiede una libreria condivisa che non può essere caricata nello spazio dei nomi Se la libreria condivisa non può essere caricata nemmeno dal
spazio dei nomi Infine, se tutti i tentativi falliscono, il linker dinamico restituisce un errore. |
namespace. |
Un elenco di librerie condivise separate da due punti in cui è possibile eseguire ricerche negli spazi dei nomi Questa proprietà non può essere utilizzata con
|
Ciò indica che il link di riserva accetta solo |
namespace. |
Un valore booleano che indica se è possibile eseguire ricerche in tutte le librerie condivise nello spazio dei nomi Questa proprietà non può essere utilizzata con
|
Ciò indica che tutti i nomi delle librerie possono passare attraverso il link di riserva
dallo spazio dei nomi |
Proprietà dello spazio dei nomi
Proprietà | Descrizione | Esempio |
---|---|---|
namespace. |
Un valore booleano che indica se il linker dinamico deve controllare la posizione della libreria condivisa. Se Se |
Ciò indica che solo le librerie condivise in |
namespace. |
Un elenco separato da due punti di directory in cui cercare le librerie condivise. Le directory specificate in Quando Ad esempio, se |
Ciò indica che il linker dinamico cerca
|
namespace. |
Un elenco di directory separate da due punti in cui cercare le librerie condivise quando è attivo AddressSanitizer (ASan).
|
Ciò indica che quando
ASan è attivato, il linker dinamico cerca prima |
namespace. |
Un elenco di directory (incluse le sottodirectory) separate da due punti in cui il linker dinamico può caricare le librerie condivise (oltre a Possono essere caricate anche le librerie condivise che si trovano nelle sottodirectory di Se |
Ciò indica che le librerie condivise in Ad esempio, senza |
namespace. |
Un elenco di directory separate da due punti in cui il linker dinamico può caricare le librerie condivise quando ASan è attivato.
|
Ciò indica che quando ASan è attiva, le librerie condivise in |
namespace. |
Un valore booleano che indica se il programma (diverso da
Se Se |
Ciò indica che |
Creazione dello spazio dei nomi del linker
In Android 11, la configurazione del linker viene creata in fase di esecuzione in /linkerconfig
anziché utilizzare file di testo normale in ${android-src}/system/core/rootdir/etc
. La configurazione viene generata al momento del caricamento in base all'ambiente di runtime, che include i seguenti elementi:
- Se il dispositivo supporta VNDK
- Versione VNDK target della partizione del fornitore
- Versione VNDK della partizione del prodotto
- Moduli APEX installati
La configurazione del linker viene creata risolvendo le dipendenze tra gli spazi dei nomi del linker. Ad esempio, se sono presenti aggiornamenti ai moduli APEX che includono aggiornamenti delle dipendenze, la configurazione del linker viene generata in base a queste modifiche. Puoi trovare ulteriori dettagli per creare la configurazione del linker in ${android-src}/system/linkerconfig
.
Isolamento dello spazio dei nomi del linker
Esistono tre tipi di configurazione. A seconda del valore di PRODUCT_TREBLE_LINKER_NAMESPACES
e BOARD_VNDK_VERSION
in BoardConfig.mk
, la configurazione corrispondente viene generata al momento dell'avvio.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
Configurazione selezionata | Requisito VTS |
---|---|---|---|
true |
current |
VNDK |
Obbligatorio per i dispositivi lanciati con Android 9 o versioni successive |
Vuoto | VNDK Lite |
Obbligatorio per i dispositivi lanciati con Android 8.x | |
false |
Vuoto | Legacy |
Per i dispositivi non Treble |
La configurazione VNDK Lite isola le librerie condivise SP-HAL e VNDK-SP. In Android 8.0, deve essere il file di configurazione per il linker dinamico quando PRODUCT_TREBLE_LINKER_NAMESPACES
è true
.
La configurazione VNDK isola anche le librerie condivise SP-HAL e VNDK-SP. Inoltre, questa configurazione fornisce l'isolamento completo del linker dinamico. Garantisce che i moduli nella partizione di sistema non dipendono dalle librerie condivise nelle partizioni del fornitore e viceversa.
In Android 8.1 o versioni successive, la configurazione VNDK è la configurazione predefinita
e ti consigliamo vivamente di attivare l'isolamento completo del linker dinamico impostando
BOARD_VNDK_VERSION
su current
.
Configurazione VNDK
La configurazione VNDK isola le dipendenze delle librerie condivise tra la partizione di sistema e le partizioni del fornitore. Rispetto alle configurazioni descritte nella precedente sottosezione, le differenze sono descritte di seguito:
-
Processi del framework
- Vengono creati gli spazi dei nomi
default
,vndk
,sphal
ers
. - Tutti gli spazi dei nomi sono isolati.
- Le librerie condivise di sistema vengono caricate nello spazio dei nomi
default
. - Gli SP-HAL vengono caricati nello spazio dei nomi
sphal
. - Librerie condivise VNDK-SP caricate nello spazio dei nomi
vndk
.
- Vengono creati gli spazi dei nomi
-
Processi del fornitore
- Vengono creati gli spazi dei nomi
default
,vndk
esystem
. - Lo spazio dei nomi
default
è isolato. - Le librerie condivise del fornitore vengono caricate nello spazio dei nomi
default
. - Le librerie condivise VNDK e VNDK-SP vengono caricate nello spazio dei nomi
vndk
. - LL-NDK e le sue dipendenze vengono caricati nello spazio dei nomi
system
.
- Vengono creati gli spazi dei nomi
La relazione tra gli spazi dei nomi del linker è illustrata di seguito.

Figura 1. Isolamento dello spazio dei nomi del linker (configurazione VNDK).
Nell'immagine sopra, LL-NDK e VNDK-SP indicano le seguenti librerie condivise:
-
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
Puoi trovare maggiori dettagli in /linkerconfig/ld.config.txt
dal dispositivo.
Configurazione di VNDK Lite
A partire da Android 8.0, il linker dinamico è configurato per isolare le librerie condivise SP-HAL e VNDK-SP in modo che i relativi simboli non entrino in conflitto con altre librerie condivise del framework. La relazione tra gli spazi dei nomi del linker è illustrata di seguito.

LL-NDK e VNDK-SP indicano le seguenti librerie condivise:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libstdc++.so
(non nella configurazione)libsync.so
libvndksupport.so
libz.so
(trasferito in VNDK-SP nella configurazione)
-
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
La tabella seguente elenca la configurazione degli spazi dei nomi per i processi del framework, tratta dalla sezione [system]
della configurazione di VNDK Lite.
Namespace | Proprietà | Valore |
---|---|---|
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 (per 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 (per 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 (per il kernel RS compilato)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.so libft2.so
|
|
link.vndk.shared_libs |
VNDK-SP |
La tabella seguente mostra la configurazione degli spazi dei nomi per i processi del fornitore,
che è tratta dalla sezione [vendor]
della configurazione VNDK Lite.
Namespace | Proprietà | Valore |
---|---|---|
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} (deprecato)/product/${LIB} (deprecato)
|
isolated |
false |
Per ulteriori dettagli, consulta /linkerconfig/ld.config.txt
dal dispositivo.
Cronologia del documento
Modifiche ad Android 11
- In Android 11, i file
ld.config.*.txt
statici vengono rimossi dalla base di codice e LinkerConfig li genera in fase di runtime.
Modifiche ad Android 9
- In Android 9, lo spazio dei nomi del linker
vndk
viene aggiunto ai processi del fornitore e le librerie condivise VNDK vengono isolate dallo spazio dei nomi del linker predefinito. - Sostituisci
PRODUCT_FULL_TREBLE
con un valore più specificoPRODUCT_TREBLE_LINKER_NAMESPACES
. - Android 9 modifica i nomi dei seguenti file di configurazione del linker dinamico.
Android 8.x Android 9 Descrizione ld.config.txt.in
ld.config.txt
Per i dispositivi con isolamento dello spazio dei nomi del linker di runtime ld.config.txt
ld.config.vndk_lite.txt
Per i dispositivi con isolamento dello spazio dei nomi del linker VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
Per i dispositivi precedenti con Android 7.x o versioni precedenti - Rimuovi
android.hardware.graphics.allocator@2.0.so
. - Le partizioni
product
eodm
vengono aggiunte.