RenderScript , Android'de hesaplama açısından yoğun görevleri yüksek performansla çalıştırmaya yönelik bir çerçevedir. Seri iş yükleri de faydalanabilmesine rağmen, veri paralel hesaplamayla kullanılmak üzere tasarlanmıştır. RenderScript çalışma zamanı, çok çekirdekli CPU'lar ve GPU'lar gibi bir cihazda bulunan işlemciler arasındaki çalışmayı paralel hale getirerek geliştiricilerin işi planlamak yerine algoritmaları ifade etmeye odaklanmasını sağlar. RenderScript özellikle görüntü işleme, hesaplamalı fotoğrafçılık veya bilgisayarla görme gerçekleştiren uygulamalar için kullanışlıdır.
Android 8.0 ve üstünü çalıştıran cihazlar aşağıdaki RenderScript çerçevesini ve satıcı HAL'lerini kullanır:
Android 7.x ve önceki sürümlerdeki RenderScript'ten farklar şunlardır:
- Bir süreçte RenderScript dahili kütüphanelerinin iki örneği. Bir set CPU geri dönüş yolu içindir ve doğrudan
/system/lib
konumundandır; diğer set GPU yolu içindir ve/system/lib/vndk-sp
. -
/system/lib
içindeki RS dahili kütüphaneleri platformun bir parçası olarak oluşturulmuştur vesystem.img
yükseltildikçe güncellenir. Ancak,/system/lib/vndk-sp
dosyasındaki kütüphaneler satıcı için oluşturulmuştur vesystem.img
yükseltildiğinde güncellenmez (bir güvenlik düzeltmesi için güncellenebilseler de ABI'leri aynı kalır). - Satıcı kodu (RS HAL, RS sürücüsü ve
bcc plugin
)/system/lib/vndk-sp
konumunda bulunan RenderScript dahili kitaplıklarına bağlanır./system/lib
kütüphanelere karşı bağlantı kuramazlar çünkü o dizindeki kütüphaneler platform için oluşturulmuştur ve bu nedenle satıcı koduyla uyumlu olmayabilir (yani semboller kaldırılabilir). Bunu yapmak, yalnızca çerçeve OTA'sını imkansız hale getirecektir.
Tasarım
Aşağıdaki bölümlerde Android 8.0 ve sonraki sürümlerde RenderScript tasarımının ayrıntıları verilmektedir.
Satıcıların kullanımına sunulan RenderScript kütüphaneleri
Bu bölüm, satıcı kodunun kullanabileceği ve bağlantı kurulabilecek RenderScript kitaplıklarını (Aynı İşlem HAL'leri veya VNDK-SP için Satıcı NDK olarak bilinir) listeler. Ayrıca, RenderScript ile ilgisi olmayan ancak satıcı koduna da sağlanan ek kitaplıkların ayrıntılarını da içerir.
Aşağıdaki kitaplık listesi Android sürümleri arasında farklılık gösterse de belirli bir Android sürümü için değişmezdir; Kullanılabilir kitaplıkların güncel bir listesi için /system/etc/ld.config.txt
dosyasına bakın.
RenderScript Kitaplıkları | RenderScript Olmayan Kitaplıklar |
---|---|
|
|
Bağlayıcı ad alanı yapılandırması
VNDK-SP'de olmayan kütüphanelerin satıcı kodu tarafından kullanılmasını engelleyen bağlantı kısıtlaması, bağlayıcı ad alanı kullanılarak çalışma zamanında uygulanır. (Ayrıntılar için VNDK Tasarım sunumuna bakın.)
Android 8.0 ve üstünü çalıştıran bir cihazda, RenderScript dışındaki tüm Aynı İşlem HAL'leri (SP-HAL'ler), sphal
bağlayıcı ad alanının içine yüklenir. RenderScript, RenderScript kitaplıkları için biraz daha gevşek bir uygulama sağlayan bir konum olan RenderScript'e özgü ad alanı rs
yüklenir. RS uygulamasının derlenmiş bit kodunu yüklemesi gerektiğinden, rs
ad alanının yoluna /data/*/*.so
eklenir (diğer SP-HAL'lerin veri bölümünden kütüphaneler yüklemesine izin verilmez).
Ek olarak, rs
ad alanı diğer ad alanlarının sağladığından daha fazla kütüphaneye izin verir. libmediandk.so
ve libft2.so
, rs
ad alanına açıktır çünkü libRS_internal.so
bu kitaplıklara dahili bir bağımlılığı vardır.
Sürücüler yükleniyor
CPU geri dönüş yolu
Bir RS bağlamı oluştururken RS_CONTEXT_LOW_LATENCY
bitinin varlığına bağlı olarak CPU veya GPU yolu seçilir. CPU yolu seçildiğinde, libRS_internal.so
(RS çerçevesinin ana uygulaması), RS lib'lerinin platform sürümünün sağlandığı varsayılan bağlayıcı ad alanından doğrudan dlopen
.
Satıcının RS HAL uygulaması, CPU geri dönüş yolu alındığında hiç kullanılmaz ve null mVendorDriverName
ile bir RsContext
nesnesi oluşturulur. libRSDriver.so
(varsayılan olarak) dlopen
ed'dir ve çağıran ( libRS_internal.so
) aynı zamanda default
ad alanına da yüklendiğinden, sürücü lib'i default
ad alanından yüklenir.
GPU yolu
GPU yolu için libRS_internal.so
farklı şekilde yüklenir. İlk olarak libRS.so
, android.hardware.renderscript@1.0.so
(RS HAL'in satıcı uygulaması) adı verilen farklı bir bağlayıcı ad alanına yüklemek için android.hardware.renderscript@1.0-impl.so
(ve onun temelini oluşturan libhidltransport.so
) kullanır. sphal
. RS HAL daha sonra libRS_internal.so
dosyasını rs
adı verilen başka bir bağlayıcı ad alanına dlopen
.
Satıcılar, RS HAL uygulamasına ( hardware/interfaces/renderscript/1.0/default/Context.cpp
) gömülü olan OVERRIDE_RS_DRIVER
oluşturma zamanı işaretini ayarlayarak kendi RS sürücülerini sağlayabilirler. Bu sürücü adı daha sonra GPU yolunun RS bağlamı için dlopen
.
RsContext
nesnesinin oluşturulması RS HAL uygulamasına devredilmiştir. HAL, argüman olarak kullanılacak sürücünün adıyla birlikte rsContextCreateVendor()
işlevini kullanarak RS çerçevesine geri çağrı yapar. Daha sonra RS çerçevesi, RsContext
başlatıldığında belirtilen sürücüyü yükler. Bu durumda, RsContext
nesnesi rs
ad alanı içinde oluşturulduğundan ve /vendor/lib
ad alanının arama yolunda olduğundan sürücü kitaplığı rs
ad alanına yüklenir.
default
ad alanından sphal
ad alanına geçiş yaparken, libhidltransport.so
, dinamik bağlayıcının sphal
ad alanından -impl.so
kitaplığını yüklemesini açıkça sipariş etmek için android_load_sphal_library()
işlevini kullanır.
sphal
ad alanından rs
ad alanına geçiş sırasında yükleme, /system/etc/ld.config.txt
dosyasında aşağıdaki satır kullanılarak dolaylı olarak yapılır:
namespace.sphal.link.rs.shared_libs = libRS_internal.so
Bu satır, lib sphal
ad alanından bulunamadığında/yüklenemediğinde dinamik bağlayıcının libRS_internal.so
dosyasını rs
ad alanından yüklemesi gerektiğini belirtir (bu her zaman böyledir çünkü sphal
ad alanı /system/lib/vndk-sp
aramaz) libRS_internal.so
bulunur). Bu yapılandırmayla, libRS_internal.so
basit bir dlopen()
çağrısı, ad alanı geçişini gerçekleştirmek için yeterlidir.
Bcc eklentisi yükleniyor
bcc plugin
bcc
derleyicisine yüklenen satıcı tarafından sağlanan bir kitaplıktır. bcc
/system/bin
dizinindeki bir sistem işlemi olduğundan, bcc plugin
kitaplığı bir SP-HAL (yani, ciltlenmeden doğrudan sistem işlemine yüklenebilen bir satıcı HAL) olarak düşünülebilir. Bir SP-HAL olarak bcc-plugin
kütüphanesi:
-
libLLVM.so
gibi yalnızca çerçeve kitaplıklarına bağlanılamaz. - Yalnızca satıcının kullanabileceği VNDK-SP kitaplıklarına bağlantı verebilir.
Bu kısıtlama, android_sphal_load_library()
işlevi kullanılarak bcc plugin
sphal
ad alanına yüklenmesiyle uygulanır. Android'in önceki sürümlerinde, eklenti adı -load
seçeneği kullanılarak belirtildi ve lib, libLLVM.so
tarafından basit dlopen()
kullanılarak yüklendi. Android 8.0 ve üzeri sürümlerde bu -plugin
seçeneğinde belirtilir ve lib doğrudan bcc
kendisi tarafından yüklenir. Bu seçenek, açık kaynak LLVM projesine Android'e özgü olmayan bir yol sağlar.
ld.mc için arama yolları
ld.mc
yürütülürken, bazı RS çalışma zamanı kitaplıkları bağlayıcıya giriş olarak verilir. Uygulamadaki RS bit kodu, çalışma zamanı kitaplıklarına bağlanır ve dönüştürülen bit kodu, bir uygulama işlemine yüklendiğinde, çalışma zamanı kitaplıkları, dönüştürülen bit kodundan tekrar dinamik olarak bağlanır.
Çalışma zamanı kütüphaneleri şunları içerir:
-
libcompiler_rt.so
-
libm.so
-
libc.so
- RS sürücüsü (
libRSDriver.so
veyaOVERRIDE_RS_DRIVER
)
Derlenmiş bit kodunu uygulama işlemine yüklerken, ld.mc
tarafından kullanılan kitaplığın aynısını sağlayın. Aksi takdirde derlenen bit kodu, bağlandığında mevcut olan bir sembolü bulamayabilir.
Bunu yapmak için, RS çerçevesi, RS çerçevesinin kendisinin /system/lib
mi yoksa /system/lib/vndk-sp
yüklendiğine bağlı olarak, ld.mc
yürütülürken çalışma zamanı kitaplıkları için farklı arama yolları kullanır. Bu, bir RS çerçeve kütüphanesinin rastgele bir sembolünün adresini okuyarak ve dosya yolunu adrese eşlemek için dladdr()
kullanarak belirlenebilir.
SELinux politikası
Android 8.0 ve sonraki sürümlerdeki SELinux politikası değişikliklerinin bir sonucu olarak, vendor
bölümündeki ek dosyaları etiketlerken belirli kurallara ( neverallows
aracılığıyla uygulanan) uymanız gerekir:
-
vendor_file
vendor
bölümündeki tüm dosyalar için varsayılan etiket olmalıdır. Platform politikası, geçişli HAL uygulamalarına erişim için bunu gerektirir. - Satıcı SEPolicy aracılığıyla
vendor
bölümüne eklenen tüm yeniexec_types
vendor_file_type
niteliğine sahip olması gerekir. Bu,neverallows
aracılığıyla uygulanır. - Gelecekteki platform/çerçeve güncellemeleriyle çakışmaları önlemek için
vendor
bölümünde dosyalarıexec_types
dışında etiketlemekten kaçının. - AOSP tarafından tanımlanan aynı işlem HAL'lerine yönelik tüm kitaplık bağımlılıkları,
same_process_hal_file
olarak etiketlenmelidir.
SELinux politikasıyla ilgili ayrıntılar için bkz. Android'de Güvenliği Geliştirilmiş Linux .
Bit kodu için ABI uyumluluğu
Yeni API eklenmezse, yani HAL sürüm artışı olmayacaksa, RS çerçeveleri mevcut GPU (HAL 1.0) sürücüsünü kullanmaya devam edecektir.
Bit kodunu etkilemeyen küçük HAL değişiklikleri (HAL 1.1) için çerçeveler, bu yeni eklenen API'ler için CPU'ya geri dönmeli ve GPU (HAL 1.0) sürücüsünü başka bir yerde kullanmaya devam etmelidir.
Bit kodu derlemesini/bağlantısını etkileyen büyük HAL değişiklikleri (HAL 2.0) için RS çerçeveleri, satıcı tarafından sağlanan GPU sürücülerini yüklememeyi seçmeli ve bunun yerine hızlandırma için CPU veya Vulkan yolunu kullanmalıdır.
RenderScript bit kodunun tüketilmesi üç aşamada gerçekleşir:
Sahne | Detaylar |
---|---|
Derle |
|
Bağlantı |
|
Yük |
|
HAL'a ek olarak çalışma zamanı API'leri ve dışa aktarılan semboller de arayüzlerdir. Her iki arayüz de Android 7.0'dan (API 24) bu yana değişmedi ve bunu Android 8.0 ve sonrasında değiştirmeye yönelik acil bir plan yok. Ancak arayüz değişirse HAL sürümü de artacaktır.
Satıcı uygulamaları
Android 8.0 ve üzeri, GPU sürücüsünün düzgün çalışması için bazı GPU sürücüsü değişiklikleri gerektirir.
Sürücü modülleri
- Sürücü modülleri listede bulunmayan herhangi bir sistem kütüphanesine bağlı olmamalıdır.
- Sürücü kendi
android.hardware.renderscript@1.0-impl_{NAME}
dosyasını sağlamalı veya varsayılan uygulamayıandroid.hardware.renderscript@1.0-impl
bağımlılığı olarak bildirmelidir. - CPU uygulaması
libRSDriver.so
VNDK-SP dışı bağımlılıkların nasıl kaldırılacağına iyi bir örnektir.
Bit kodu derleyicisi
Satıcı sürücüsü için RenderScript bit kodunu iki şekilde derleyebilirsiniz:
-
/vendor/bin/
(tercih edilen GPU derleme yöntemi) konumunda satıcıya özel RenderScript derleyicisini çağırın. Diğer sürücü modüllerine benzer şekilde satıcı derleyici ikili dosyası, satıcıların kullanabileceği RenderScript kitaplıkları listesinde olmayan herhangi bir sistem kitaplığına bağlı olamaz. - Satıcının sağladığı
bcc plugin
ile system bcc'yi çağırın:/system/bin/bcc
; bu eklenti, satıcıların kullanabileceği RenderScript kitaplıkları listesinde bulunmayan herhangi bir sistem kitaplığına bağlı olamaz.
Satıcının bcc plugin
CPU derlemesine müdahale etmesi gerekiyorsa ve libLLVM.so
olan bağımlılığı kolayca kaldırılamıyorsa, satıcı bcc
(ve libLLVM.so
, libbcc.so
dahil olmak üzere tüm LL-NDK olmayan bağımlılıkları) kopyalamalıdır. /vendor
bölümü.
Ayrıca satıcıların aşağıdaki değişiklikleri yapması gerekir:
-
libclcore.bc
/vendor
bölümüne kopyalayın. Bu,libclcore.bc
,libLLVM.so
velibbcc.so
senkronize olmasını sağlar. - RS HAL uygulamasından
RsdCpuScriptImpl::BCC_EXE_PATH
ayarını yaparakbcc
yürütülebilir dosyasının yolunu değiştirin.
SELinux politikası
SELinux politikası hem sürücüyü hem de derleyicinin yürütülebilir dosyalarını etkiler. Tüm sürücü modülleri aygıtın file_contexts
dosyasında same_process_hal_file
olarak etiketlenmelidir. Örneğin:
/vendor/lib(64)?/libRSDriver_EXAMPLE\.so u:object_r:same_process_hal_file:s0
Derleyicinin yürütülebilir dosyası, bcc'nin satıcı kopyası ( /vendor/bin/bcc
) gibi bir uygulama işlemi tarafından çağrılabilmelidir. Örneğin:
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 düşük.
- product_FULL_TREBLE_OVERRIDE tanımlı değil.
Eski cihazlar için, Android 8.0 ve sonraki sürümlere yükseltme sırasında kısıtlamalar uygulanmaz; bu, sürücülerin /system/lib[64]
içindeki kitaplıklara bağlanmaya devam edebileceği anlamına gelir. Ancak OVERRIDE_RS_DRIVER
ile ilgili mimari değişikliği nedeniyle /vendor
bölümüne android.hardware.renderscript@1.0-impl
kurulmalıdır; bunu yapmamak, RenderScript çalışma zamanı geri dönüşünü CPU yoluna zorlar.
Renderscript'in kullanımdan kaldırılmasının nedenleri hakkında bilgi için Android Geliştiricileri Blogu: Android GPU Compute Going Forward'a bakın. Bu kullanımdan kaldırmaya ilişkin kaynak bilgileri aşağıdakileri içerir:
- Renderscript'ten taşıma
- RenderScriptMigration Örneği
- İçsel Yedek Araç Seti README
- İçsel Değiştirme Araç Takımı.kt