Dynamiczne narzędzie łączące eliminuje 2 wyzwania związane z projektowaniem Treble VNDK:
- Biblioteki udostępnione SP-HAL i ich zależności, w tym VNDK-SP są wczytywane do procesów platformy. Trzeba co pozwala zapobiegać konfliktom symboli.
dlopen()
iandroid_dlopen_ext()
mogą przedstawić niektóre zależności środowiska wykonawczego, które są niewidoczne w czasie kompilacji i mogą być trudne do wykrycia za pomocą analizy statycznej.
Te 2 problemy można rozwiązać za pomocą przestrzeni nazw powiązania . Mechanizm ten jest dostarczany przez dynamiczny tag łączący. it biblioteki udostępnione w różnych przestrzeniach nazw tagu łączącego, biblioteki o tej samej nazwie, ale z innymi symbolami nie powodują konfliktu.
Z drugiej strony mechanizm przestrzeni nazw tagu łączącego zapewnia elastyczność Dzięki temu niektóre biblioteki udostępnione można eksportować przez przestrzeń nazw tagu łączącego, a następnie używać ich innej przestrzeni nazw tagu łączącego. Wyeksportowane biblioteki udostępnione mogą zostać interfejsów programowania aplikacji, które są publicznie dostępne dla innych programów ukrywanie szczegółów implementacji w przestrzeniach nazw tagu łączącego.
Na przykład: /system/lib[64]/libcutils.so
i
/system/lib[64]/vndk-sp-${VER}/libcutils.so
to 2 wspólne elementy
biblioteki. Te 2 biblioteki mogą mieć różne symbole. Wczytano
na różne przestrzenie nazw tagu łączącego, tak aby moduły platformy mogły zależeć od
Biblioteki udostępnione /system/lib[64]/libcutils.so
i SP-HAL mogą
zależy od: /system/lib[64]/vndk-sp-${VER}/libcutils.so
.
Z drugiej strony /system/lib[64]/libc.so
to przykład
biblioteki publicznej eksportowanej przez przestrzeń nazw tagu łączącego i importowanych do
w przestrzeniach nazw tagów łączących. Zależności funkcji
/system/lib[64]/libc.so
, na przykład libnetd_client.so
,
są wczytywane do przestrzeni nazw, w której /system/lib[64]/libc.so
w domu. Inne przestrzenie nazw nie będą miały dostępu do tych zależności. Ten
umieszcza w nim szczegóły implementacji, a jednocześnie udostępnia
i interfejsów.
Jak to działa
Dynamiczny tag łączący odpowiada za ładowanie określonych bibliotek udostępnionych
we wpisach DT_NEEDED
lub w bibliotekach udostępnionych określonych przez
argument dlopen()
lub android_dlopen_ext()
. W obu
dynamiczny tag linków znajduje przestrzeń nazw tagu łączącego, w której element wywołujący
i próbuje wczytać zależności w tej samej przestrzeni nazw tagu łączącego. Jeśli
dynamiczny tag łączący nie może wczytać udostępnionej biblioteki do określonego tagu łączącego
przestrzeni nazw, prosi o powiązaną przestrzeń nazw tagu łączącego o wyeksportowane dane udostępnione
biblioteki.
Format pliku konfiguracji
Format pliku konfiguracji opiera się na formacie pliku INI. Typowa 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:
- Kilka właściwości mapowania sekcji katalogów na początku dynamiczny tag łączący, aby wybrać odpowiednią sekcję.
-
Kilka sekcji konfiguracji przestrzeni nazw tagu łączącego:
- Każda sekcja zawiera kilka przestrzeni nazw (wierzchołki grafu) i kilka połączenia zastępcze między przestrzeniami nazw (łuki wykresu).
- Każda przestrzeń nazw ma własne odizolowanie, ścieżki wyszukiwania, dozwolone ścieżki, i ustawieniami widoczności.
W tabelach poniżej szczegółowo opisujemy znaczenie poszczególnych właściwości.
Właściwość mapowania sekcji katalogu
Właściwość | Opis | Przykład |
---|---|---|
|
Ścieżka do katalogu, który znajduje się w sekcji Każda właściwość mapuje pliki wykonywalne w katalogu na tag łączący
konfiguracji przestrzeni nazw. Mogą być co najmniej 2 właściwości
które mają taką samą wartość |
Oznacza to, że konfiguracja określona w tagu
Sekcja Zastosowanie ma konfiguracja określona w sekcji |
Właściwości relacji
Właściwość | Opis | Przykład |
---|---|---|
additional. |
Rozdzielona przecinkami lista dodatkowych przestrzeni nazw (oprócz
|
Oznacza to, że istnieją 3 przestrzenie nazw ( |
namespace. |
Rozdzielona przecinkami lista zastępczych przestrzeni nazw. Jeśli w bieżącej przestrzeni nazw nie można znaleźć udostępnionej biblioteki, komponent dynamiczny tag łączący próbuje wczytać bibliotekę współdzieloną z zastępczych przestrzeni nazw. przestrzeń nazw określona na początku listy ma wyższy priorytet. |
Jeśli biblioteka współdzielona lub plik wykonywalny żąda biblioteki udostępnionej, która
nie można wczytać do przestrzeni nazw Jeśli nie można załadować biblioteki udostępnionej z poziomu
Jeśli żadna próba się nie powiedzie, dynamiczny tag łączący zwróci błąd. |
namespace. |
Rozdzielona dwukropkiem lista bibliotek udostępnionych, którą można przeszukiwać
Tej usługi nie można używać z:
|
Oznacza to, że link zastępczy akceptuje tylko |
namespace. |
Wartość logiczna wskazująca, czy wszystkie biblioteki udostępnione można
wyszukiwano w przestrzeni nazw Tej usługi nie można używać z:
|
Oznacza to, że wszystkie nazwy bibliotek mogą przejść przez link zastępczego.
z przestrzeni nazw |
Właściwości przestrzeni nazw
Właściwość | Opis | Przykład |
---|---|---|
namespace. |
Wartość logiczna wskazująca, czy dynamiczny tag łączący powinien sprawdzić gdzie znajduje się biblioteka udostępniona. Jeśli Jeśli |
Oznacza to, że tylko biblioteki udostępnione w
Wartość |
namespace. |
Rozdzielona dwukropkiem lista katalogów do wyszukania udostępnionych biblioteki. Katalogi określone we właściwości Jeśli Jeśli na przykład |
Wskazuje to, że
|
namespace. |
Rozdzielona dwukropkiem lista katalogów, w których należy szukać bibliotek udostępnionych, Usługa AddressSanitizer (ASan) jest włączona.
|
Oznacza to, że gdy
ASan jest włączony w
dynamiczny tag łączący wyszukuje najpierw |
namespace. |
Rozdzielana dwukropkiem lista katalogów (łącznie z podkatalogami), gdzie
dynamiczny tag łączący może wczytywać biblioteki udostępnione (oprócz
Biblioteki udostępnione, które należą do podkatalogów
Plik Jeśli |
Oznacza to, że biblioteki udostępnione objęte
Plik Na przykład bez atrybutu |
namespace. |
Rozdzielona dwukropkiem lista katalogów, do których może wczytać dynamiczny tag łączący biblioteki udostępnione, gdy włączony jest ASan.
|
Oznacza to, że gdy włączony jest interfejs ASan,
biblioteki udostępnione w ramach pakietu |
namespace. |
Wartość logiczna wskazująca, czy program (inny niż
Jeśli Jeśli |
Oznacza to, że |
Tworzenie przestrzeni nazw tagu łączącego
Na Androidzie 11 konfiguracja tagu łączącego jest tworzona w czasie działania w
/linkerconfig
zamiast zwykłych plików tekstowych w
${android-src}/system/core/rootdir/etc
Konfiguracja jest generowana podczas uruchamiania urządzenia
w zależności od środowiska wykonawczego, które obejmuje te elementy:
- Jeśli urządzenie obsługuje VNDK
- Docelowa wersja VNDK partycji dostawcy
- Wersja VNDK partycji produktu
- Zainstalowane moduły APEX
Konfiguracja tagu łączącego jest tworzona przez rozwiązanie zależności między przestrzeniami nazw tagu łączącego. Dla:
Jeśli na przykład są jakieś aktualizacje modułów APEX, które obejmują aktualizacje zależności, tag łączący
odzwierciedlenie tych zmian. Więcej informacji o tworzeniu konfiguracji tagu łączącego
znajduje się w
${android-src}/system/linkerconfig
Izolacja przestrzeni nazw tagu łączącego
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 urządzenia.
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 |
Obowiązkowe na urządzeniach wprowadzonych na rynek z Androidem 8.x | |
false |
Puste | Legacy |
Urządzenia inne niż wysokie |
Konfiguracja VNDK Lite izoluje biblioteki współdzielone SP-HAL i VNDK-SP. W Androidzie 8.0
musi być plikiem konfiguracji dynamicznego tagu łączącego, gdy
Obecny stan „PRODUCT_TREBLE_LINKER_NAMESPACES
”: true
.
Konfiguracja VNDK izoluje też biblioteki współdzielone SP-HAL i VNDK-SP. Ponadto ta konfiguracja zapewnia pełną izolację dynamicznego tagu łączącego. Dzięki temu moduły w partycji systemowej nie są zależne od współdzielonej na partycjach dostawcy i odwrotnie.
W Androidzie 8.1 i nowszych konfiguracja VNDK jest konfiguracją domyślną
Zdecydowanie zalecamy włączenie pełnej izolacji dynamicznego tagu łączącego za pomocą ustawienia
BOARD_VNDK_VERSION
do current
.
Konfiguracja VNDK
Konfiguracja VNDK izoluje zależności biblioteki współdzielonej między partycją systemową a partycjami dostawcy. W porównaniu z konfiguracji wymienionych w poprzedniej podsekcji, różnice są opisane poniżej:
-
Procesy platformy
default
,vndk
, Tworzone są przestrzenie nazwsphal
irs
.- Wszystkie przestrzenie nazw są izolowane.
- Systemowe biblioteki udostępnione są wczytywane do przestrzeni nazw
default
. - Listy SP-HAL są wczytywane do przestrzeni nazw
sphal
. - Biblioteki udostępnione VNDK-SP wczytane do przestrzeni nazw
vndk
.
-
Procesy dostawców
- Tworzone są przestrzenie nazw
default
,vndk
isystem
. - Przestrzeń nazw
default
jest izolowana. - Biblioteki udostępnione dostawcy są wczytywane do przestrzeni nazw
default
. - Biblioteki udostępnione VNDK i VNDK-SP są wczytywane do przestrzeni nazw
vndk
. - Zasób LL-NDK i jego zależności są wczytywane do przestrzeni nazw
system
.
- Tworzone są przestrzenie nazw
Poniżej przedstawiono relację między przestrzeniami nazw tagu łączącego.
Rysunek 1. Izolacja przestrzeni nazw tagu łączącego (konfiguracja VNDK).
Na powyższym obrazie LL-NDK i VNDK-SP oznaczają następujące znaki biblioteki udostępnione:
-
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 sekcji /linkerconfig/ld.config.txt
z poziomu urządzenia.
Konfiguracja VNDK Lite
Od Androida w wersji 8.0 dynamiczny tag łączący jest skonfigurowany tak, aby izolować SP-HAL i kody łączące Biblioteki udostępnione VNDK-SP w taki sposób, aby ich symbole nie kolidowały z innymi biblioteki współdzielone platformy. Relacja między przestrzeniami nazw tagu łączącego: poniżej.
LL-NDK i VNDK-SP oznaczają następujące biblioteki współdzielone:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libstdc++.so
(nie znajduje się w konfiguracji)libsync.so
libvndksupport.so
libz.so
(przeniesiono do VNDK-SP w konfigurację)
-
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 na potrzeby platformy
które jest wyodrębnione z sekcji [system]
w
konfiguracji VNDK Lite.
Przestrzeń nazw | 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 (dla 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 RS)
|
|
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óry pochodzi z sekcji [vendor]
w
konfiguracji VNDK Lite.
Przestrzeń nazw | 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} (wycofano)/product/${LIB} (wycofano)
|
isolated |
false |
Więcej informacji znajdziesz w sekcji /linkerconfig/ld.config.txt
z poziomu urządzenia.
Historia dokumentu
Zmiany w Androidzie 11
- Na Androidzie 11 statyczne pliki
ld.config.*.txt
są zostaną usunięte z bazy kodu, a LinkerConfig generuje je w środowisku wykonawczym.
Zmiany w Androidzie 9
- W Androidzie 9 przestrzeń nazw tagu łączącego
vndk
jest dodawana do dostawcy procesy i biblioteki udostępnione VNDK są odizolowane od domyślnego tagu łączącego przestrzeni nazw. - Zastąp
PRODUCT_FULL_TREBLE
bardziej szczegółowym tekstemPRODUCT_TREBLE_LINKER_NAMESPACES
- Android 9 zmienia nazwy tej konfiguracji dynamicznego tagu łączącego
.
Android 8.x Android 9 Opis ld.config.txt.in
ld.config.txt
Dla urządzeń z izolacją przestrzeni nazw kreatora linków środowiska wykonawczego ld.config.txt
ld.config.vndk_lite.txt
Dla urządzeń z izolacją przestrzeni nazw tagu łączącego VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
Starsze urządzenia z Androidem 7.x lub starszym - Usuń
android.hardware.graphics.allocator@2.0.so
. - Dodano partycje
product
iodm
.