RenderScript, yoğun sayısal işlemler çalıştırmaya yönelik bir çerçevedir yüksek performanslı görevlere ulaşmanızı sağlar. Birlikte kullanılmak üzere tasarlanmıştır seri iş yükleri de başarılı olabilir. İlgili içeriği oluşturmak için kullanılan RenderScript çalışma zamanı, mevcut işlemcilerde paralel bir şekilde çalışır. gibi çeşitli cihaz modellerine odaklanarak geliştiricilerin algoritmaları ifade etmektir. RenderScript, özellikle Resim işleme, sayısal işlemler ve bilgisayar vizyonu olabilir.
Android 8.0 ve sonraki sürümleri çalıştıran cihazlar aşağıdaki RenderScript'i kullanır çerçeve ve tedarikçi HAL’leri:
Şekil 1. Dahili kitaplıklara bağlantı veren tedarikçi kodu.
Android 7.x ve önceki sürümlerde RenderScript ile arasındaki farklar şunlardır:
- Bir işlemdeki iki RenderScript dahili kitaplığı örneği. Bir grup
CPU yedek yolu ve doğrudan
/system/lib
noktasından gelir; diğer grubu, GPU yolu içindir ve/system/lib/vndk-sp
parametresindendir. /system/lib
konumundaki RS dahili kitaplıklarısystem.img
yeni sürüme geçdikçe güncellenir. Ancak libs/system/lib/vndk-sp
tedarikçi için geliştirilmiştir vesystem.img
yeni sürüme geçirildiğinde güncellenir (ancak güncellenebilirler) ABI'si aynı kalır).- Tedarikçi firma kodu (RS HAL, RS sürücüsü ve
bcc plugin
) şu adreste bulunan RenderScript dahili kitaplıklarıyla bağlantılıdır:/system/lib/vndk-sp
. Şuradaki kitaplıklarla bağlantı oluşturamazlar:/system/lib
çünkü bu dizindeki kitaplıklar platformda yer alır ve bu nedenle tedarikçi firma koduyla (ör. semboller) kaldırılabilir). Bu durumda yalnızca çerçeveye yönelik bir OTA'yı kullanmak imkansızdır.
Tasarım
Aşağıdaki bölümlerde, Android 8.0 ve sonraki sürümlerdeki RenderScript tasarımı ayrıntılı olarak açıklanmaktadır.
Tedarikçi firmalara sunulan RenderScript kitaplıkları
Bu bölümde RenderScript kitaplıkları (Aynı Süreç için Tedarikçi NDK olarak bilinir) listelenmektedir. HAL veya VNDK-SP) içeren, tedarikçi firma kodu tarafından kullanılabilen ve bağlanabilen . Ayrıca Bunlar da tedarikçi firma koduna sağlanmış durumdadır.
Aşağıdaki kitaplık listesi Android sürümleri arasında farklılık gösterebilir, ancak
belirli Android sürümleri için
değişmezdir. güncel bir liste görmek için
kütüphaneler için /system/etc/ld.config.txt
bölümüne bakın.
RenderScript Kitaplıkları | RenderScript Olmayan Kitaplıklar |
---|---|
|
|
Bağlayıcı ad alanı yapılandırması
VNDK-SP'de olmayan kitaplıkların kullanılmasını engelleyen bağlantı kısıtlaması, tedarikçi kodu, bağlayıcı ad alanı kullanılarak çalışma zamanında zorunlu kılınır. (Ayrıntılar için VNDK Tasarımı'na bakın dikkat edin.)
Android 8.0 ve sonraki sürümleri çalıştıran cihazlarda tüm Aynı İşlem HAL'ler (SP-HAL'ler)
RenderScript hariç olmak üzere bağlayıcı ad alanının içine yüklenmiştir.
sphal
. RenderScript, RenderScript'e özel
ad alanı rs
, biraz daha esnek bir
oluşturmayı öğreneceksiniz. RS uygulamasının yüklenmesi gerektiğinden
bit kodundan derlenen /data/*/*.so
değeri eklenir.
rs
ad alanı (diğer SP-HAL'lerin
veri bölümü).
Ayrıca, rs
ad alanı için sağlanandan daha fazla libre
diğer ad alanları tarafından gerçekleştirilir. libmediandk.so
libft2.so
rs
ad alanına maruz kaldığı için
libRS_internal.so
, bu kitaplıklara dahili bağımlılığa sahip.
Şekil 2. Bağlayıcı için ad alanı yapılandırması.
Sürücüleri yükleyin
CPU yedek yolu
RS_CONTEXT_LOW_LATENCY
bitinin varlığına bağlı olarak
RS bağlamı oluşturulurken CPU veya GPU yolu seçilir.
CPU yolu seçildi, libRS_internal.so
(ana uygulama
(RS çerçevesinin sonuncusu), doğrudan varsayılan bağlayıcıdan dlopen
edilir
ad alanı için geçerlidir.
CPU
yedek yol alınır ve RsContext
nesnesi oluşturulur
null mVendorDriverName
. libRSDriver.so
(şuna göre:
varsayılan) dlopen
edilir ve sürücü kitaplığı
default
ad alanı
(libRS_internal.so
), default
konumunda da yüklendi
tıklayın.
Şekil 3. CPU yedek yolu.
GPU yolu
GPU yolu için libRS_internal.so
farklı bir şekilde yüklenir.
İlk olarak libRS.so
,
android.hardware.renderscript@1.0.so
(ve temel
libhidltransport.so
) sonra
android.hardware.renderscript@1.0-impl.so
(tedarikçi firma
uygulanması) adı verilen farklı bir bağlayıcı ad alanına
sphal
. RS
HAL, ardından başka bir grupta dlopen
libRS_internal.so
rs
adlı bağlayıcı ad alanını içerir.
Tedarikçiler, derleme zamanı işaretini ayarlayarak kendi RS sürücülerini sağlayabilir
RS HAL'ye yerleştirilmiş olan OVERRIDE_RS_DRIVER
uygulama
(hardware/interfaces/renderscript/1.0/default/Context.cpp
). Bu
sürücü adı daha sonra GPU yoluna ilişkin RS bağlamı için dlopen
kullanılır.
RsContext
nesnesini oluşturma yetkisi RS HAL'ye verilir
bazı ipuçları vereceğim. HAL, RS çerçevesini şunu kullanarak geri çağırır:
rsContextCreateVendor()
fonksiyonu
kullanabilirsiniz. RS çerçevesi daha sonra
RsContext
başlatıldı. Bu durumda, sürücü kitaplığı
rs
ad alanına RsContext
nesne, rs
ad alanının içinde oluşturulur ve
/vendor/lib
, ad alanının arama yolundadır.
4.Şekil GPU yedek yolu.
default
ad alanından
sphal
ad alanı, libhidltransport.so
ise
android_load_sphal_library()
fonksiyonunu açık bir şekilde
dinamik bağlayıcıdan yararlanarak -impl.so
kitaplığını
sphal
ad alanı.
sphal
ad alanından
rs
ad alanı, yükleme işlemi aşağıdaki satır aracılığıyla dolaylı olarak gerçekleştirilir
/system/etc/ld.config.txt
:
namespace.sphal.link.rs.shared_libs = libRS_internal.so
Bu satır, dinamik bağlayıcının yüklenmesi gerektiğini belirtir
lib olduğunda rs
ad alanından libRS_internal.so
sphal
ad alanından (her zaman
sphal
ad alanı arama yapmaz.
/system/lib/vndk-sp
(libRS_internal.so
)
yer alır). Bu yapılandırmayla basit bir dlopen()
çağrısı,
libRS_internal.so
, ad alanı geçişini yapmak için yeterlidir.
bcc eklentisini yükle
bcc plugin
, tedarikçi firma tarafından sağlanan ve
bcc
derleyicisi. bcc
bir sistem işlemi olduğundan
/system/bin
dizini için, bcc plugin
kitaplığı şöyle olabilir:
SP-HAL (yani
sistem süreci) için de kullanılabilir. SP-HAL olarak,
bcc-plugin
kitaplığı:
- Şu gibi yalnızca çerçevelere yönelik kitaplıklara bağlantı oluşturulamaz:
libLLVM.so
- Yalnızca satıcının kullanabileceği VNDK-SP kitaplıklarına bağlanabilir.
Bu kısıtlama, bcc plugin
öğesinin
sphal
ad alanı
android_sphal_load_library()
işlevi. Önceki sürümlerinde
Android'de, eklenti adı -load
seçeneği kullanılarak belirtilir ve
lib, basit dlopen()
kullanılarak yüklenmiştir.
libLLVM.so
. Android 8.0 ve sonraki sürümlerde, bu
-plugin
seçeneğini belirlerseniz kitaplık doğrudan
bcc
. Bu seçenek,
açık kaynak LLVM projesi.
5. Şekil. bcc eklentisi yükleniyor, Android 7.x ve önceki sürümler.
6. Şekil. bcc eklentisi yükleniyor, Android 8.0 ve sonraki sürümler.
ld.mc için arama yolları
ld.mc
yürütülürken bazı RS çalışma zamanı kitaplıkları giriş olarak verilir
gönderir. Uygulamadaki RS bit kodu, çalışma zamanı kitaplıklarına bağlanır
Dönüştürülen bit kodu bir uygulama işlemine yüklendiğinde, çalışma zamanı
dönüştürülmüş bit kodundan dinamik olarak bağlanır.
Çalışma zamanı kitaplıkları şunları içerir:
libcompiler_rt.so
libm.so
libc.so
- RS sürücüsü (
libRSDriver.so
veyaOVERRIDE_RS_DRIVER
)
Derlenen bit kodunu uygulama işlemine yüklerken,
ld.mc
tarafından kullanılan kitaplık. Aksi halde, derlenen bit kodu
bağlandığında kullanılabilir durumdaki bir simgeyi bulamayabilir.
Bunu yapmak için RS çerçevesi, aşağıdaki durumlarda çalışma zamanı kitaplıkları için farklı arama
RS çerçevesinin yürütülüp yürütülmesine bağlı olarak ld.mc
/system/lib
veya /system/lib/vndk-sp
üzerinden yüklendi.
Bu, RS'nin rastgele bir sembolünün adresi okunarak belirlenebilir.
çerçeve kitaplığını ve dosya yolunun eşlenmesini sağlamak için dladdr()
kullanma
bilgileri de ekleyebilirsiniz.
SELinux politikası
Android 8.0 ve sonraki sürümlerdeki SELinux politikası değişikliklerinin bir sonucu olarak,
belirli kurallara uygun hareket edecek (neverallows
tarihine kadar uygulanır)
vendor
bölümündeki ek dosyalar etiketleniyor:
vendor_file
, şuradaki tüm dosyalar için varsayılan etiket olmalıdır:vendor
bölüm. Platform politikası uyarınca geçişli HAL uygulamalarını ele alacağız.vendor
bölümüne eklenen tüm yeniexec_types
öğeleri aracılığıyla iletilecek satıcı SEPolicy,vendor_file_type
özelliğine sahip olmalıdır. Bu özellikneverallows
aracılığıyla uygulanır.- Gelecekteki platform/çerçeve güncellemeleriyle çakışma olmaması için etiketlemeden kaçının
vendor
bölümündeexec_types
dışındaki dosyalar. - AOSP tarafından tanımlanan aynı işlem HAL'leri için tüm kitaplık bağımlılıkları
same_process_hal_file
olarak etiketlendi.
SELinux politikasıyla ilgili ayrıntılar için bkz. Android'de Güvenlik Açısından Geliştirilmiş Linux.
Bit kodu için ABI uyumluluğu
Yeni API eklenmezse HAL sürümü yükseltilmesi gerekmez. RS çerçeveleri, mevcut GPU (HAL 1.0) sürücüsünü kullanmaya devam eder.
Bit kodunu etkilemeyen küçük HAL değişiklikleri (HAL 1.1) için çerçeveler, için CPU'ya geçiş yapın ve GPU (HAL 1.0) sürücüsünü kullanmaya devam edin olduğunu anlayabilir.
Bit kodu derlemesini/bağlamayı etkileyen büyük HAL değişiklikleri (HAL 2.0) için, RS çerçevelerin tedarikçi tarafından sağlanan GPU sürücülerini değil, hızlandırma için CPU veya Vulkan yolunu kullanın.
RenderScript bit kodunun kullanımı üç aşamada gerçekleşir:
Sahne | Ayrıntılar |
---|---|
Derleyin |
|
Bağlantı |
|
Yükle |
|
HAL'ye ek olarak, çalışma zamanı API'leri ve dışa aktarılan simgeler de kullanır. Android 7.0'dan (API 24) bu yana iki arayüz de değişmedi ve Android 8.0 ve sonraki sürümlerde bu özelliği değiştirmeyi hemen planlamıyoruz. Ancak, arayüz değiştiğinde, HAL sürümü de artar.
Tedarikçi uygulamaları
Android 8.0 ve sonraki sürümler, GPU sürücüsünün ve düzgün çalışır.
Sürücü modülleri
- Sürücü modülleri, şurada bulunmayan sistem kitaplıklarına bağımlı olmamalıdır: listesini kullanın.
- Sürücü, kendi verilerini sağlamalıdır
android.hardware.renderscript@1.0-impl_{NAME}
veya varsayılan uygulamaandroid.hardware.renderscript@1.0-impl
ve bağımlılığını gösterir. libRSDriver.so
CPU uygulaması, VNDK-SP olmayan bağımlılıkları kaldırın.
Bit kodu derleyici
Tedarikçi firma sürücüsü için RenderScript bit kodunu iki şekilde derleyebilirsiniz:
/vendor/bin/
içinde tedarikçi firmaya özgü RenderScript derleyiciyi çağırın (tercih edilen GPU derleme yöntemi). Diğer sürücü modüllerinde olduğu gibi satıcı derleyici ikili programı, RenderScript kitaplıklarının listesi kullanılabilir.- Sistem bcc'sini çağırın: Tedarikçi firma tarafından sağlanan bir
/system/bin/bcc
bcc plugin
; bu eklenti, listesinde değil RenderScript kitaplıkları kullanılabilir dikkatinizi çekebilir.
bcc plugin
tedarikçisinin CPU'ya müdahale etmesi gerekiyorsa
bir derleme işlemi ve bu derlemenin libLLVM.so
üzerindeki bağımlılığı
kaldırılırsa tedarikçi firmanın bcc
(ve LL-NDK olmayan tüm
bağımlılıklarını (libLLVM.so
, libbcc.so
dahil)
/vendor
bölüm.
Ayrıca, tedarikçi firmaların aşağıdaki değişiklikleri de yapması gerekir:
7.Şekil Tedarikçi firma sürücüsüyle ilgili değişiklikler.
libclcore.bc
öğesini/vendor
bölümüne kopyala. Bulibclcore.bc
,libLLVM.so
velibbcc.so
senkronize durumda.- Şu ayarı uygulayarak
bcc
yürütülebilir dosyanın yolunu değiştirin RS HAL uygulamasındanRsdCpuScriptImpl::BCC_EXE_PATH
.
SELinux politikası
SELinux politikası hem sürücüyü hem de derleyici yürütülebilir dosyalarını etkiler. Tümü
sürücü modüllerinisame_process_hal_file
cihazın file_contexts
cihazı. Örnek:
/vendor/lib(64)?/libRSDriver_EXAMPLE\.so u:object_r:same_process_hal_file:s0
Derleyici yürütülebilir dosyası, olduğu gibi bir uygulama işlemi tarafından da başlatılabilmelidir.
bcc'nin tedarikçi firma kopyası (/vendor/bin/bcc
). Örnek:
device/vendor_foo/device_bar/sepolicy/file_contexts: /vendor/bin/bcc u:object_r:same_process_hal_file:s0
Eski cihazlar
Eski cihazlar, aşağıdaki koşulları karşılayan cihazlardır:
- PRODUCT_SHIPPING_API_LEVEL, 26'dan küçük.
- PRODUCT_FULL_TREBLE_OVERRIDE tanımlı değil.
Eski cihazlarda,
Android 8.0 ve sonraki sürümler: Sürücüler, kitaplıklara bağlantı vermeye devam edebilir.
/system/lib[64]
içinde. Ancak, mimari değişikliği nedeniyle
OVERRIDE_RS_DRIVER
ile ilgili,
android.hardware.renderscript@1.0-impl
,
/vendor
bölümü; bunu yapmamak RenderScript çalışma zamanını zorunlu kılar
yardımcı olur.
Renderscript'in kullanımdan kaldırılma nedeni hakkında bilgi için Android Developers'a bakın Blog: Android GPU Compute İleriye Dönük. Desteğin sonlandırılmasıyla ilgili kaynak bilgileri şunları içerir:
- Renderscript'ten taşıma
- RenderScriptMigration Örneği
- Intrinsics Değiştirme Araç Seti BENİOKU
- Intrinsics DeğişimiToolkit.kt