RenderScript

.

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 ve system.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
  • android.hardware.graphics.renderscript@1.0.so
  • libRS_internal.so
  • libRSCpuRef.so
  • libblas.so
  • libbcinfo.so
  • libcompiler_rt.so
  • libRSDriver.so
  • libc.so
  • libm.so
  • libdl.so
  • libstdc++.so
  • liblog.so
  • libnativewindow.so
  • libsync.so
  • libvndksupport.so
  • libbase.so
  • libc++.so
  • libcutils.so
  • libutils.so
  • libhardware.so
  • libhidlbase.so
  • libhidltransport.so
  • libhwbinder.so
  • liblzma.so
  • libz.so
  • libEGL.so
  • libGLESv1_CM.so
  • libGLESv2.so

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 dlopenedilir 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) dlopenedilir 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 veya OVERRIDE_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 yeni exec_types öğeleri aracılığıyla iletilecek satıcı SEPolicy, vendor_file_type özelliğine sahip olmalıdır. Bu özellik neverallows aracılığıyla uygulanır.
  • Gelecekteki platform/çerçeve güncellemeleriyle çakışma olmaması için etiketlemeden kaçının vendor bölümünde exec_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
  • bcc için giriş bit kodu (.bc) şu aralıkta olmalıdır: LLVM 3.2 bit kodu biçimi ve bcc geri olmalıdır mevcut (eski) uygulamalarla uyumludur.
  • Ancak, .bc dosyasındaki meta veriler değişebilir (yeni bir çalışma zamanı işlevler, ör. Atama belirleyiciler ∓ alıcılar, matematik fonksiyonları vb.). Bölüm oranında çalışma zamanı işlevleri libclcore.bc içinde, bir kısmı da LibRSDriver veya tedarikçi firma eşdeğerinde bulunur.
  • Yeni çalışma zamanı işlevleri veya meta veri değişikliklerinin bozulması için bit kodu API düzeyini ayarlayın. Tedarikçi sürücüler bunu kullanamayacakları için, HAL sürümü de artırılmalıdır.
  • Sağlayıcıların kendi derleyicileri olabilir, ancak bcc kodu bu derleyiciler için de geçerlidir.
Bağlantı
  • Derlenen .o dosyası tedarikçi firma sürücüsüne (ör. libRSDriver_foo.so ve libcompiler_rt.so. CPU yol libRSDriver.so ile bağlanacak.
  • .o, libRSDriver_foo ürününden yeni bir çalışma zamanı API'si gerektiriyorsa desteklemesi için tedarikçi sürücünün güncellenmesi gerekir.
  • Bazı tedarikçilerin kendi bağlayıcıları olabilir, ancak ld.mc onlar için de geçerlidir.
Yükle
  • libRSCpuRef, paylaşılan nesneyi yükler. Varsa HAL sürümünü yükseltmesi gerekir.
  • Tedarikçiler, paylaşılan verileri yüklemek için libRSCpuRef kullanır. veya kendi uygulamalarını uygulayabilir.

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 uygulama android.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:

  1. /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.
  2. 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.

  1. libclcore.bc öğesini /vendor bölümüne kopyala. Bu libclcore.bc, libLLVM.so ve libbcc.so senkronize durumda.
  2. Şu ayarı uygulayarak bcc yürütülebilir dosyanın yolunu değiştirin RS HAL uygulamasından RsdCpuScriptImpl::BCC_EXE_PATH.
ziyaret edin.

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:

  1. PRODUCT_SHIPPING_API_LEVEL, 26'dan küçük.
  2. 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: