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.
Te 2 problemy można rozwiązać za pomocą mechanizmu przestrzeni nazw łączących. Ten mechanizm jest udostępniany przez dynamicznego linkera. Może izolować biblioteki udostępnione w różnych przestrzeniach nazw kreatora linków, co pozwala uniknąć konfliktu w bibliotekach o tej samej nazwie, ale z różnymi symbolami.
Z drugiej strony mechanizm przestrzeni nazw tagu łączącego zapewnia elastyczność, dzięki czemu niektóre biblioteki udostępnione można eksportować za pomocą przestrzeni nazw tagu łączącego i używać ich w innej przestrzeni nazw tagu łączącego. 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 współdzielone 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. Mechanizm ten opisuje szczegóły implementacji, zapewniają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 tag łączący nie może wczytać biblioteki udostępnionej do określonej przestrzeni nazw tagu łączącego, wysyła do połączonej przestrzeni nazw kreatora linków prośbę o wyeksportowane biblioteki udostępnione.
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) oraz kilka linków zapasowych między przestrzeniami nazw (łuki grafu).
- Każda przestrzeń nazw 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. |
Lista dodatkowych przestrzeni nazw (oprócz przestrzeni nazw |
Oznacza to, że w konfiguracji |
namespace. |
Rozdzielana przecinkami lista przestrzeni nazw zapasowych. Jeśli nie można znaleźć biblioteki udostępnionej w bieżącej przestrzeni nazw, dynamiczny linker próbuje załadować bibliotekę udostępnioną z przełączalnych przestrzeni nazw. Przestrzeń nazw podana 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 żadna próba się nie powiedzie, dynamiczny tag łączący zwróci błąd. |
namespace. |
Lista oddzielonych dwukropami nazw udostępnionych bibliotek, w których można przeszukiwać w przestrzeni nazw Nie można używać tej usługi w połączeniu z usługą |
Oznacza to, że link zapasowy akceptuje jako nazwę biblioteki tylko |
namespace. |
Wartość logiczna wskazująca, czy można wyszukiwać w przestrzeni nazw Nie można używać tej usługi w połączeniu z usługą |
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ółdzielona. 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 współdzielone biblioteki, gdy włączona jest opcja AddressSanitizer (ASan).
|
Oznacza to, że gdy włączona jest funkcja ASan, dynamiczny tag łączący przeszukuje najpierw |
namespace. |
Rozdzielona dwukropkiem lista katalogów (łącznie z podkatalogami), w których dynamiczny tag łączący może wczytywać biblioteki udostępnione (oprócz Można też wczytywać biblioteki udostępnione znajdujące się w podkatalogach Jeśli |
Oznacza to, że biblioteki udostępnione z poziomu Na przykład bez |
namespace. |
Rozdzielona dwukropkiem lista katalogów, do których dynamiczny tag łączący może wczytywać biblioteki udostępnione, gdy włączony jest protokół 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
. 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 tagu łączącego znajdziesz tutaj: ${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
jej konfiguracja jest generowana podczas uruchamiania.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
Wybrana konfiguracja | Wymagania dotyczące VTS |
---|---|---|---|
true |
current |
VNDK |
Obowiązkowe w przypadku urządzeń 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 tagu łączącego. Dzięki temu moduły na partycji systemowej nie będą zależeć od bibliotek udostępnionych na partycjach dostawcy 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 sekcji różnice są następujące:
-
Procesy dotyczące 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 izolowana. - 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ólne SP-HAL i VNDK-SP, aby ich symbole nie wchodziły w kolizję z innymi bibliotekami wspólnymi frameworka. Poniżej przedstawiliśmy relację między przestrzeniami nazw tagu łączącego.
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
(przeniesiono do VNDK-SP w 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 platformy wyodrębnionej z sekcji [system]
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 |
Poniższa tabela przedstawia konfigurację przestrzeni nazw dla procesów dostawcy, która została pobrana z sekcji [vendor]
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 statyczne pliki
ld.config.*.txt
są usuwane z bazy kodu, a LinkerConfig generuje je w czasie działania.
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 poniższych plików konfiguracji dynamicznego tagu łączącego.
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
.