RenderScript to platforma do uruchamiania wymagających obliczeń zadania z dużą wydajnością na Androidzie. Przeznaczony do stosowania w ramach obliczeń równoległych, chociaż zadania szeregowe też mogą być korzystne. Środowisko wykonawcze RenderScript zapewnia równoległą pracę na różnych procesorach dostępnych na takich jak procesory wielordzeniowe i GPU, dzięki czemu deweloperzy mogą skupić się za pomocą algorytmów, a nie na planowania pracy. Skrypt RenderScript jest szczególnie ważny przydatne w aplikacjach do przetwarzania obrazu, fotografii i rozpoznawania obrazów.
Urządzenia z Androidem 8.0 lub nowszym używają tego skryptu RenderScript platformy i listy HAL dostawców:
Rysunek 1. Kod dostawcy zawierający link do wewnętrznych bibliotek.
Różnice w stosunku do metody RenderScript w Androidzie 7.x i starszych:
- 2 wystąpienia wewnętrznych bibliotek RenderScript w procesie. Jeden zestaw dotyczy
Ścieżka zastępcza procesora pochodzi bezpośrednio z
/system/lib
; drugi ustawiono dla ścieżki GPU i pochodzi z/system/lib/vndk-sp
. - Wewnętrzne biblioteki RS w
/system/lib
są częścią i są aktualizowane wraz z uaktualnieniem usługisystem.img
. Jednak libs w/system/lib/vndk-sp
są tworzone dla dostawcy i nie są aktualizowana po uaktualnieniusystem.img
(w czasie, gdy można je aktualizować dla poprawki zabezpieczeń, interfejs ABI pozostaje bez zmian). - Kod dostawcy (RS HAL, sterownik RS i
bcc plugin
) to: połączone z wewnętrznymi bibliotekami RenderScript na stronie/system/lib/vndk-sp
Nie mogą tworzyć powiązań z bibliotekami w/system/lib
, ponieważ biblioteki lib w tym katalogu są tworzone dla i z tego powodu mogą być niezgodne z kodem dostawcy (tj. symbolami mogą zostać usunięte). W przeciwnym razie nie byłoby możliwe wdrożenie OTA obejmujące tylko platformę.
Projektowanie
W poniższych sekcjach znajdziesz szczegółowe informacje o projekcie RenderScript w Androidzie 8.0 i nowszych.
Biblioteki RenderScript dostępne dla dostawców
Ta sekcja zawiera listę bibliotek RenderScript (używanych jako plik NDK dostawcy w przypadku Same-Process) HAL lub VNDK-SP) dostępne dla kodu dostawcy, które można połączyć przeciwko Google. Zawiera również szczegóły dodatkowych bibliotek, które nie są związane z RenderScript, ale są one też przekazywane kodowi dostawcy.
Ta lista bibliotek może się różnić w zależności od wersji Androida:
jest niezmienna w przypadku konkretnej wersji Androida; aby poznać aktualną listę
dostępnych bibliotek, sprawdź /system/etc/ld.config.txt
.
Biblioteki RenderScript | Biblioteki inne niż renderScript |
---|---|
|
|
Konfiguracja przestrzeni nazw tagu łączącego
Ograniczenie łączenia, które uniemożliwia użycie bibliotek spoza VNDK-SP przez kod dostawcy jest wymuszany w czasie działania za pomocą przestrzeni nazw tagu łączącego. Aby dowiedzieć się więcej, zapoznaj się z dokumentem VNDK Design prezentacji).
na urządzeniu z Androidem 8.0 lub nowszym ze wszystkimi kodami HAL Same-Process (SP-HAL).
oprócz RenderScriptu, które są ładowane w przestrzeni nazw kreatora linków
sphal
Skrypt RenderScript jest wczytywany do
przestrzeń nazw rs
, lokalizacja, która umożliwia nieco luźniejsze
wymuszania na podstawie bibliotek RenderScript. Ponieważ implementacja RS musi się wczytać
skompilowanego kodu bitowego, do ścieżki parametru /data/*/*.so
Przestrzeń nazw rs
(inne identyfikatory SP-HAL nie mogą ładować libs z biblioteki
partycji danych).
Oprócz tego przestrzeń nazw rs
zezwala na większą liczbę bibliotek, niż podano w przypadku
przez inne przestrzenie nazw. libmediandk.so
i libft2.so
są dostępne w przestrzeni nazw rs
, ponieważ
Biblioteka libRS_internal.so
jest związana z tymi bibliotekami wewnętrznie.
Rysunek 2. Konfiguracja przestrzeni nazw na potrzeby tagu łączącego.
Wczytaj sterowniki
Ścieżka kreacji zastępczej procesora
W zależności od istnienia RS_CONTEXT_LOW_LATENCY
bitu
podczas tworzenia kontekstu RS, wybierana jest ścieżka CPU lub GPU. Gdy
Wybrana ścieżka procesora: libRS_internal.so
(główna implementacja
platformy RS) jest bezpośrednio blokowana z poziomu domyślnego tagu łączącego (dlopen
).
przestrzeń nazw, w której podana jest wersja platformy RS libs.
Implementacja RS HAL od dostawcy w ogóle nie jest używana, gdy procesor
ścieżki zastępczej, i tworzony jest obiekt RsContext
,
wartość null mVendorDriverName
. libRSDriver.so
to (wg
dlopen
ed, a biblioteka sterownika jest wczytywana z biblioteki
Przestrzeń nazw default
, ponieważ element wywołujący
(libRS_internal.so
) jest również wczytywany w: default
przestrzeni nazw.
Rysunek 3. Ścieżka zastępcza procesora.
Ścieżka GPU
W przypadku ścieżki GPU obiekt libRS_internal.so
jest ładowany w inny sposób.
Po pierwsze, libRS.so
używa
android.hardware.renderscript@1.0.so
(i jej bazowa)
libhidltransport.so
), aby wczytać
android.hardware.renderscript@1.0-impl.so
(dostawca
implementacji kodu RS HAL) w innej przestrzeni nazw tagu łączącego o nazwie
sphal
. Wspólnota
HAL, a potem dlopen
s libRS_internal.so
w kolejnym
przestrzeń nazw tagu łączącego o nazwie rs
.
Dostawcy mogą dodać własnego sterownika RS, ustawiając flagę czasu kompilacji
OVERRIDE_RS_DRIVER
, który jest umieszczony w RS HAL
wdrożenie
(hardware/interfaces/renderscript/1.0/default/Context.cpp
). Ten
nazwa sterownika jest następnie poprzedzana dlopen
w kontekście RS w ścieżce GPU.
Tworzenie obiektu RsContext
jest delegowane do RS HAL
implementacji. HAL wywołuje platformę RS za pomocą parametru
rsContextCreateVendor()
o nazwie sterownika do
użyć jako argumentu. Platforma RS następnie wczytuje określony sterownik, gdy
Zainicjowano RsContext
. W tym przypadku biblioteka sterowników to
wczytano do przestrzeni nazw rs
, ponieważ RsContext
obiekt jest tworzony w przestrzeni nazw rs
,
/vendor/lib
wskazuje ścieżkę wyszukiwania przestrzeni nazw.
Rysunek 4. Ścieżka zastępcza GPU.
Podczas przechodzenia z przestrzeni nazw default
do
Przestrzeń nazw sphal
, libhidltransport.so
używa
android_load_sphal_library()
do jawnego uporządkowania argumentu
dynamiczny tag łączący, aby wczytać bibliotekę -impl.so
z tagu
Przestrzeń nazw sphal
.
Podczas przechodzenia z przestrzeni nazw sphal
do
rs
; wczytywanie odbywa się pośrednio przez następujący wiersz w
/system/etc/ld.config.txt
:
namespace.sphal.link.rs.shared_libs = libRS_internal.so
Ten wiersz określa, jak powinien wczytać dynamiczny tag łączący
libRS_internal.so
z przestrzeni nazw rs
, gdy lib
nie można znaleźć/wczytać z przestrzeni nazw sphal
(która zawsze jest
ten przypadek, bo przestrzeń nazw sphal
nie przeszukuje
/system/lib/vndk-sp
, gdzie libRS_internal.so
). W przypadku tej konfiguracji proste wywołanie dlopen()
Do przeprowadzenia przejścia w przestrzeni nazw wystarczy libRS_internal.so
.
Wczytaj wtyczkę UDW
bcc plugin
to biblioteka dostarczana przez dostawcę wczytana do
Kompilator bcc
. Ponieważ bcc
jest procesem systemowym w
/system/bin
, biblioteka bcc plugin
może być
uznaje się za SP-HAL (tj. HAL dostawcy, który można bezpośrednio wczytać do
proces systemu bez powiązania). Jako SP-HAL
Biblioteka bcc-plugin
:
- Nie można połączyć z bibliotekami działającymi wyłącznie na platformie, takimi jak
libLLVM.so
- Można łączyć tylko z bibliotekami VNDK-SP dostępnymi dla dostawcy.
To ograniczenie jest egzekwowane przez wczytanie zasady bcc plugin
w
Przestrzeń nazw sphal
korzystająca z parametru
android_sphal_load_library()
. W poprzednich wersjach
na Androida nazwa wtyczki została określona za pomocą opcji -load
i
Biblioteka lib została wczytana za pomocą prostego polecenia dlopen()
przez
libLLVM.so
W Androidzie 8.0 i nowszych jest to określone w
-plugin
, a biblioteka lib jest ładowana bezpośrednio przez
bcc
. Ta opcja umożliwia zastosowanie ścieżki niezwiązanej z Androidem
projektu LLVM (open source).
Rysunek 5. Wczytuję wtyczkę UDW (Android 7.x lub starszy).
Rysunek 6. Wczytuję wtyczkę UDW (Android 8.0 lub nowszy).
Ścieżki wyszukiwania adresów ld.mc
Podczas wykonywania zadania ld.mc
niektóre biblioteki środowiska wykonawczego RS są podawane jako dane wejściowe
do tagu łączącego. Kod bitowy RS z aplikacji jest połączony z bibliotekami środowiska wykonawczego
a gdy przekonwertowany kod bitowy jest wczytywany do procesu aplikacji, biblioteka środowiska wykonawczego
są ponownie dynamicznie łączone z przekonwertowanego kodu bitowego.
Biblioteki środowiska wykonawczego obejmują:
libcompiler_rt.so
libm.so
libc.so
- Kierowca RS (
libRSDriver.so
lubOVERRIDE_RS_DRIVER
).
Podczas wczytywania skompilowanego kodu bitowego do procesu aplikacji podaj dokładnie taki sam kod
z biblioteki używanej przez usługę ld.mc
. W przeciwnym razie skompilowany kod bitowy
może nie znaleźć symbolu, który był dostępny podczas łączenia.
Platforma RS używa do tego różnych ścieżek wyszukiwania w bibliotece środowiska wykonawczego, gdy
wykonując zadanie ld.mc
, w zależności od tego, czy sama platforma RS jest
wczytano z /system/lib
lub /system/lib/vndk-sp
.
Można to określić, odczytując adres dowolnego symbolu RS
Framework lib i używaniem dladdr()
do zmapowania ścieżki pliku
adres.
Zasada SELinux
W związku ze zmianami zasad SELinux w Androidzie 8.0 i nowszych musisz
postępuj zgodnie z określonymi regułami (egzekwowanymi przez neverallows
), gdy
oznaczanie dodatkowych plików etykietami w partycji vendor
:
vendor_file
musi być etykietą domyślną dla wszystkich plików wvendor
partycja. Zasady platformy wymagają tego, aby mieć dostęp przekazujących implementacji HAL.- Wszystkie nowe
exec_types
zostały dodane w partycjivendor
za pośrednictwem SEPolicy dostawcy musi mieć atrybutvendor_file_type
. Jest to wymuszane przezneverallows
. - Aby uniknąć konfliktów z przyszłymi aktualizacjami platformy lub platformy, unikaj oznaczania etykietami
pliki inne niż
exec_types
w partycjivendor
. - Wszystkie zależności bibliotek w przypadku kluczy HAL z tym samym procesem zidentyfikowanym przez AOSP muszą być
oznaczony jako
same_process_hal_file
.
Szczegółowe informacje na temat zasad SELinux znajdziesz w sekcji Ulepszone zabezpieczenia w systemie Linux
Zgodność z interfejsem ABI w przypadku kodu bitowego
Jeśli nie zostaną dodane żadne nowe interfejsy API, co oznacza, że nie będzie aktualizacji wersji HAL, platformy RS będzie nadal korzystać z dotychczasowego sterownika GPU (HAL 1.0).
W przypadku niewielkich zmian HAL (HAL 1.1), które nie mają wpływu na kod bitowy, platforma powinna w przypadku tych nowo dodanych interfejsów API przełącz się na procesor graficzny (HAL 1.0) i nadal używaj sterownika GPU (HAL 1.0) w innym miejscu.
W przypadku większych zmian HAL (HAL 2.0) wpływających na kompilację/łączenie kodów bitowych, RS platformy powinny nie wczytywać sterowników GPU udostępnionych przez dostawcę, użyj procesora lub ścieżki Vulkan do przyspieszania działania.
Przetwarzanie kodu bitowego RenderScript odbywa się w 3 etapach:
Etap | Szczegóły |
---|---|
Kompilowanie |
|
Link |
|
Wczytaj |
|
Oprócz kodu HAL interfejsy API środowiska wykonawczego i wyeksportowane symbole są również i interfejsów. Od Androida 7.0 (API 24) żaden interfejs nie uległ zmianie nie planujecie w najbliższym czasie jej zmienić w Androidzie 8.0 i nowszych. Jeśli jednak zmienia się interfejs, wersja HAL również zwiększa się.
Implementacje dostawców
Android 8.0 lub nowszy wymaga pewnych zmian sterownika GPU, aby można było nie działają poprawnie.
Moduły sterowników
- Moduły sterowników nie mogą korzystać z żadnych bibliotek systemowych, które nie znajdują się w listę.
- Kierowca musi przesłać własny
android.hardware.renderscript@1.0-impl_{NAME}
lub zadeklaruj domyślna implementacjaandroid.hardware.renderscript@1.0-impl
jako jej zależności. - Implementacja procesora
libRSDriver.so
to dobry przykład usuń zależności inne niż VNDK-SP.
Kompilator kodu bitowego
Kod bitowy RenderScript na potrzeby sterownika dostawcy możesz skompilować na 2 sposoby:
- Wywołaj specyficzny dla dostawcy kompilator RenderScript w języku
/vendor/bin/
(preferowana metoda kompilacji GPU). Podobnie jak w przypadku innych modułów sterownikowych, plik binarny kompilatora dostawcy nie może zależeć od żadnej biblioteki systemowej, która nie jest lista bibliotek RenderScript dla dostawców. - Wywołaj pole UDW systemu:
/system/bin/bcc
z użyciem adresu dostawcybcc plugin
ten dodatek nie może korzystać z biblioteki systemowej, nie znajduje się na liście Dostępne biblioteki RenderScript dostawcom.
Jeśli dostawca bcc plugin
musi zakłócać działanie procesora
kompilacja i jej zależność od libLLVM.so
nie mogą być łatwe
usunięty, dostawca powinien skopiować bcc
(oraz wszystkie pliki inne niż LL-NDK
w tym libLLVM.so
i libbcc.so
) w
/vendor
partycja.
Dodatkowo dostawcy muszą wprowadzić te zmiany:
Rysunek 7. Zmiany sterownika dostawcy.
- Skopiuj
libclcore.bc
do partycji/vendor
. Ten zapewnialibclcore.bc
,libLLVM.so
i Listalibbcc.so
jest zsynchronizowana. - Zmień ścieżkę do pliku wykonywalnego
bcc
za pomocą ustawieniaRsdCpuScriptImpl::BCC_EXE_PATH
z implementacji RS HAL.
Zasada SELinux
Zasada SELinux wpływa zarówno na pliki wykonywalne sterownika, jak i na pliki wykonywalne kompilatora. Wszystkie
moduły sterownika muszą być oznaczone etykietą same_process_hal_file
w
file_contexts
na urządzeniu. Na przykład:
/vendor/lib(64)?/libRSDriver_EXAMPLE\.so u:object_r:same_process_hal_file:s0
Proces aplikacji również musi mieć możliwość wywołania pliku wykonywalnego kompilatora
kopię pola UDW (/vendor/bin/bcc
) od dostawcy. Na przykład:
device/vendor_foo/device_bar/sepolicy/file_contexts: /vendor/bin/bcc u:object_r:same_process_hal_file:s0
Starsze urządzenia
Starsze urządzenia to urządzenia, które spełniają te warunki:
- PRODUCT_SHIPPING_API_LEVEL ma wartość mniejszą niż 26.
- Nie zdefiniowany jest PRODUCT_FULL_TREBLE_OVERRIDE.
W przypadku urządzeń starszego typu ograniczenia nie są egzekwowane przy przechodzeniu na
Androida 8.0 lub nowszego, co oznacza, że sterowniki mogą nadal łączyć się z bibliotekami.
w usłudze /system/lib[64]
. Jednak ze względu na zmianę architektury
związane z: OVERRIDE_RS_DRIVER
,
android.hardware.renderscript@1.0-impl
musi być zainstalowany, aby
/vendor
partycja; Jeśli tego nie zrobisz, wymuszane jest środowisko wykonawcze RenderScript
w przypadku ścieżki procesora.
Informacje o powodach wycofania technologii Renderscript znajdziesz na stronie dla deweloperów aplikacji na Androida Blog: Android GPU Compute – dalej. Oto informacje o zasobach:
- Migracja z Renderscript
- Przykład migracji skryptu RenderScriptMigration
- Pakiet narzędzi Intrinsics Replacement Toolkit README
- Intrinsics ReplacementToolkit.kt