Linker dynamiczny rozwiązuje 2 problemy w projektowaniu Treble VNDK:
- Biblioteki wspólne SP-HAL i ich zależności, w tym biblioteki VNDK-SP, są ładowane do procesów frameworka. Powinny istnieć mechanizmy zapobiegające konfliktom symboli.
dlopen()
iandroid_dlopen_ext()
mogą wprowadzać zależności w czasie wykonywania, które nie są widoczne w czasie kompilacji i mogą być trudne do wykrycia za pomocą analizy statycznej.
Oba te problemy można rozwiązać za pomocą mechanizmu przestrzeni nazw linkera. Ten mechanizm jest udostępniany przez dynamicznego linkera. Umożliwia to odizolowanie wspólnych bibliotek w różnych przestrzeniach nazw linkera, dzięki czemu biblioteki o tej samej nazwie, ale z różnymi symbolami, nie będą ze sobą kolidować.
Z drugiej strony mechanizm przestrzeni nazw linkera zapewnia elastyczność, dzięki której niektóre wspólne biblioteki mogą być eksportowane przez przestrzeń nazw linkera i używane przez inną przestrzeń nazw linkera. Te wyeksportowane biblioteki współdzielone mogą stać się interfejsami programowania aplikacji, które są publiczne dla innych programów, a szczegóły ich implementacji są ukryte w przestrzeni nazw linkera.
Na przykład /system/lib[64]/libcutils.so
i /system/lib[64]/vndk-sp-${VER}/libcutils.so
to 2 udostępnione biblioteki. Te 2 biblioteki mogą mieć różne symbole. Są one ładowane do różnych przestrzeni nazw linkera, aby moduły frameworka mogły zależeć od /system/lib[64]/libcutils.so
, a biblioteki udostępnione SP-HAL mogły zależeć od /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
Z drugiej strony /system/lib[64]/libc.so
to przykład biblioteki publicznej, która jest eksportowana przez przestrzeń nazw linkera i importowana do wielu przestrzeni nazw linkera. Zależne od /system/lib[64]/libc.so
elementy, takie jak libnetd_client.so
, są ładowane do przestrzeni nazw, w której znajduje się /system/lib[64]/libc.so
. Inne przestrzenie nazw nie będą miały dostępu do tych zależności. Ten mechanizm pozwala ukryć szczegóły implementacji, udostępniając jednocześnie interfejsy publiczne.
Jak to działa
Linker dynamiczny odpowiada za wczytywanie bibliotek udostępnionych określonych w elementach DT_NEEDED
lub bibliotek udostępnionych określonych przez argument dlopen()
lub android_dlopen_ext()
. W obu przypadkach linker dynamiczny znajduje przestrzeń nazw linkera, w której znajduje się wywołujący, i próbuje załadować zależności do tej samej przestrzeni nazw linkera. Jeśli dynamiczny linker nie może załadować biblioteki współdzielonej w wyznaczonej przestrzeni nazw linkera, prosi połączoną przestrzeń nazw linkera o wyeksportowane biblioteki współdzielone.
Format pliku konfiguracji
Format pliku konfiguracyjnego jest oparty na formacie pliku INI. Typowy plik konfiguracji wygląda tak:
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}
Plik konfiguracji zawiera:
- Na początku kilka właściwości mapowania sekcji katalogu, aby linker dynamiczny mógł wybrać skuteczną sekcję.
-
Kilka sekcji konfiguracji przestrzeni nazw linkera:
- Każda sekcja zawiera kilka przestrzeni nazw (wierzchołków grafu) i kilka alternatywnych połączeń między przestrzeniami nazw (łuki grafu).
- Każda nazwa przestrzeni ma własne ustawienia izolacji, ścieżek wyszukiwania, ścieżek dozwolonych i widoczności.
W tabelach poniżej znajdziesz szczegółowe omówienie każdej właściwości.
Właściwość mapowania sekcji katalogu
Właściwość | Opis | Przykład |
---|---|---|
|
Ścieżka do katalogu, do którego ma zastosowanie sekcja Każda usługa mapuje pliki wykonywalne w danym katalogu do sekcji konfiguracji przestrzeni nazw linkera. Może być 2 lub więcej usług, które mają ten sam identyfikator |
Oznacza to, że konfiguracja określona w sekcji Konfiguracja określona w sekcji |
Właściwości relacji
Właściwość | Opis | Przykład |
---|---|---|
additional. |
Rozdzielana przecinkami lista dodatkowych przestrzeni nazw (oprócz przestrzeni nazw |
Oznacza to, że w konfiguracji |
namespace. |
Rozdzielana przecinkami lista przestrzeni nazw zapasowych. Jeśli w bieżącej przestrzeni nazw nie można znaleźć biblioteki udostępnionej, dynamiczny linker próbuje załadować ją z przełączalnych przestrzeni nazw. Przestrzeń nazw określona na początku listy ma wyższy priorytet. |
Jeśli biblioteka współdzielona lub plik wykonywalny żąda biblioteki współdzielonej, której nie można załadować do przestrzeni nazw Jeśli biblioteki współdzielonej nie można załadować z przestrzeni nazw Jeśli wszystkie próby zawiodą, linker dynamiczny zwraca błąd. |
namespace. |
Lista oddzielonych dwukropami nazw udostępnionych bibliotek, w których można przeszukiwać w przestrzeni nazw Tej właściwości nie można używać w połączeniu z wartością |
Oznacza to, że link zapasowy akceptuje jako nazwę biblioteki tylko |
namespace. |
Wartość logiczna wskazująca, czy można wyszukiwać w przestrzeni nazw Tej właściwości nie można używać w połączeniu z wartością |
Oznacza to, że wszystkie nazwy bibliotek mogą przechodzić przez link zapasowy z przestrzeni nazw |
Właściwości przestrzeni nazw
Właściwość | Opis | Przykład |
---|---|---|
namespace. |
Wartość logiczna wskazująca, czy dynamiczny linker ma sprawdzać, gdzie znajduje się biblioteka wspólna. Jeśli Jeśli |
Oznacza to, że do przestrzeni nazw |
namespace. |
Lista katalogów rozdzielona dwukropkami, w których mają być wyszukiwane biblioteki udostępnione. Katalogi określone w Gdy Jeśli na przykład |
Oznacza to, że linker dynamiczny przeszukuje |
namespace. |
Lista katalogów oddzielonych dwukropkiem, w których mają być wyszukiwane udostępnione biblioteki, gdy włączona jest opcja AddressSanitizer (ASan).
|
Oznacza to, że gdy włączona jest opcja ASan, linker dynamiczny najpierw przeszukuje |
namespace. |
Lista katalogów (w tym podkatalogów) oddzielonych dwukropkiem, w których linker dynamiczny może wczytywać udostępnione biblioteki (oprócz Można też wczytywać biblioteki udostępnione znajdujące się w podkatalogach Jeśli |
Oznacza to, że biblioteki udostępnione w przestrzeni nazw Na przykład bez |
namespace. |
Lista katalogów oddzielonych dwukropkiem, z których dynamiczny linker może wczytywać biblioteki współdzielone, gdy włączona jest opcja ASan.
|
Oznacza to, że gdy włączona jest usługa ASan, biblioteki współdzielone w poziomie |
namespace. |
Wartość logiczna wskazująca, czy program (inny niż Jeśli Jeśli |
Oznacza to, że |
Tworzenie przestrzeni nazw łącznika
W Androidzie 11 konfiguracja linkera jest tworzona w czasie wykonywania w katalogu /linkerconfig
, a nie w plikach tekstowych w katalogu /linkerconfig
.${android-src}/system/core/rootdir/etc
Konfiguracja jest generowana podczas uruchamiania na podstawie środowiska uruchomieniowego, które obejmuje te elementy:
- Jeśli urządzenie obsługuje VNDK
- Docelowa wersja VNDK partycji dostawcy
- Wersja VNDK w podziale produktu
- Zainstalowane moduły APEX
Konfiguracja linkera jest tworzona przez rozwiązywanie zależności między przestrzeniami nazw linkera. Jeśli na przykład w modułach APEX pojawią się aktualizacje, które obejmują aktualizacje zależności, konfiguracja linkera zostanie wygenerowana z uwzględnieniem tych zmian. Więcej informacji o tworzeniu konfiguracji linkera znajdziesz w ${android-src}/system/linkerconfig
.
Izolacja przestrzeni nazw linkera
Istnieją 3 typy konfiguracji. W zależności od wartości PRODUCT_TREBLE_LINKER_NAMESPACES
i BOARD_VNDK_VERSION
w BoardConfig.mk
odpowiednia konfiguracja jest generowana podczas uruchamiania.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
Wybrana konfiguracja | Wymagania dotyczące VTS |
---|---|---|---|
true |
current |
VNDK |
Wymagane na urządzeniach z Androidem 9 lub nowszym |
Puste | VNDK Lite |
Wymagane w przypadku urządzeń z Androidem 8.x | |
false |
Puste | Legacy |
Urządzenia inne niż Treble |
Konfiguracja VNDK Lite izoluje biblioteki wspólne SP-HAL i VNDK-SP. W Androidzie 8.0 musi to być plik konfiguracji dla linkera dynamicznego, gdy PRODUCT_TREBLE_LINKER_NAMESPACES
to true
.
Konfiguracja VNDK izoluje też biblioteki współdzielone SP-HAL i VNDK-SP. Dodatkowo ta konfiguracja zapewnia pełną izolację dynamicznego linkera. Dzięki temu moduły w partycji systemowej nie będą zależeć od udostępnionych bibliotek w partycjach dostawców i odwrotnie.
W Androidzie 8.1 lub nowszym konfiguracja VNDK jest konfiguracją domyślną. Zalecamy, aby włączyć pełną izolację linkera dynamicznego, ustawiając wartość BOARD_VNDK_VERSION
na current
.
Konfiguracja VNDK
Konfiguracja VNDK izoluje zależności biblioteki udostępnionej między partycją systemową a partycjami dostawcy. W porównaniu z konfiguracjami wymienionymi w poprzedniej podsekcji różnice są następujące:
-
Procesy platformy
- Tworzone są przestrzenie nazw
default
,vndk
,sphal
irs
. - Wszystkie przestrzenie nazw są odizolowane.
- Systemowe biblioteki udostępnione są ładowane do przestrzeni nazw
default
. - Pliki SP-HAL są ładowane do przestrzeni nazw
sphal
. - biblioteki udostępnione VNDK-SP wczytane do przestrzeni nazw
vndk
.
- Tworzone są przestrzenie nazw
-
Procesy dostawcy
- Tworzone są przestrzenie nazw
default
,vndk
isystem
. - Przestrzeń nazw
default
jest odizolowana. - Biblioteki udostępnione dostawców są ładowane do przestrzeni nazw
default
. - Biblioteki udostępnione VNDK i VNDK-SP są ładowane do przestrzeni nazw
vndk
. - LL-NDK i jego zależności są ładowane do przestrzeni nazw
system
.
- Tworzone są przestrzenie nazw
Powiązania między przestrzeniami nazw linkera zostały zilustrowane poniżej.

Rysunek 1. Izolacja przestrzeni nazw linkera (konfiguracja VNDK).
Na powyższym obrazie LL-NDK i VNDK-SP oznaczają te biblioteki współdzielone:
-
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
Więcej informacji znajdziesz w /linkerconfig/ld.config.txt
na urządzeniu.
Konfiguracja VNDK Lite
Od Androida 8.0 linker dynamiczny jest skonfigurowany tak, aby izolować biblioteki współdzielone SP-HAL i VNDK-SP, aby ich symbole nie wchodziły w kolizję z innymi bibliotekami współdzielonymi frameworku. Powiązanie między przestrzeniami nazw linkera pokazano poniżej.

LL-NDK i VNDK-SP to nazwy następujących bibliotek udostępnionych:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libstdc++.so
(nie ma w konfiguracji)libsync.so
libvndksupport.so
libz.so
(przeniesiony do VNDK-SP w ramach konfiguracji)
-
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
Tabela poniżej zawiera konfigurację przestrzeni nazw dla procesów frameworku, która jest fragmentem sekcji [system]
w konfiguracji VNDK Lite.
Namespace | Właściwość | Wartość |
---|---|---|
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 (w przypadku 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 (dla 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 (dla skompilowanego jądra PS)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.so libft2.so
|
|
link.vndk.shared_libs |
VNDK-SP |
Tabela poniżej przedstawia konfigurację przestrzeni nazw dla procesów dostawcy, która jest wyodrębniona z sekcji [vendor]
w konfiguracji VNDK Lite.
Namespace | Właściwość | Wartość |
---|---|---|
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} (wycofane)/product/${LIB} (wycofane)
|
isolated |
false |
Więcej informacji znajdziesz w /linkerconfig/ld.config.txt
na urządzeniu.
Historia dokumentu
Zmiany w Androidzie 11
- W Androidzie 11 pliki statyczne
ld.config.*.txt
są usuwane z kodu źródłowego, a zamiast tego LinkerConfig generuje je w czasie wykonywania.
Zmiany w Androidzie 9
- W Androidzie 9 do procesów dostawcy dodana jest przestrzeń nazw linkera
vndk
, a biblioteki współdzielone VNDK są izolowane od domyślnej przestrzeni nazw linkera. - Zastąp
PRODUCT_FULL_TREBLE
bardziej szczegółowymPRODUCT_TREBLE_LINKER_NAMESPACES
. - Android 9 zmienia nazwy tych plików konfiguracji linkera dynamicznego:
Android 8.x Android 9 Opis ld.config.txt.in
ld.config.txt
Na urządzeniach z izolacją przestrzeni nazw linkera w czasie wykonywania ld.config.txt
ld.config.vndk_lite.txt
Dotyczy urządzeń z izolacją przestrzeni nazw linkera VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
Urządzenia starsze z Androidem 7.x lub starszym - Usuń
android.hardware.graphics.allocator@2.0.so
. - Dodano partycje
product
iodm
.