Renderscript

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:

Şekil 1. Dahili kütüphanelere bağlanan satıcı kodu

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 ve system.img yükseltildikçe güncellenir. Ancak, /system/lib/vndk-sp dosyasındaki kütüphaneler satıcı için oluşturulmuştur ve system.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
  • 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 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.

Şekil 2. Bağlayıcı için ad alanı yapılandırması

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.

Şekil 4. CPU geri dönüş yolu

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.

Şekil 5. GPU geri dönüş yolu

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.

Şekil 6. Bcc eklentisinin yüklenmesi, Android 7.x ve altı


Şekil 7. Bcc eklentisinin yüklenmesi, Android 8.0 ve üzeri

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 veya OVERRIDE_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 yeni exec_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
  • bcc için giriş bit kodu (.bc), LLVM 3.2 bit kodu biçiminde olmalı ve bcc mevcut (eski) uygulamalarla geriye dönük olarak uyumlu olmalıdır.
  • Bununla birlikte, .bc'deki meta veriler değişebilir (yeni çalışma zamanı işlevleri olabilir, örneğin Tahsis ayarlayıcıları ∓ alıcıları, matematik işlevleri vb.). Çalışma zamanı işlevlerinin bir kısmı libclcore.bc , bir kısmı da LibRSDriver'da veya satıcı eşdeğerinde bulunur.
  • Yeni çalışma zamanı işlevleri veya meta veri değişikliklerinin bozulması, bit kodu API düzeyinin artırılmasını gerektirir. Satıcı sürücüleri bunu tüketemeyeceği için HAL sürümünün de artırılması gerekir.
  • Satıcıların kendi derleyicileri olabilir, ancak bcc ilişkin sonuçlar/gereksinimler bu derleyiciler için de geçerlidir.
Bağlantı
  • Derlenen .o, satıcı sürücüsüne (örneğin, libRSDriver_foo.so ve libcompiler_rt.so bağlanacaktır. CPU yolu libRSDriver.so ile bağlantı kuracaktır.
  • .o, libRSDriver_foo yeni bir çalışma zamanı API'si gerektiriyorsa, satıcı sürücüsünün bunu destekleyecek şekilde güncellenmesi gerekir.
  • Bazı satıcıların kendi bağlayıcıları olabilir ancak ld.mc argümanı onlar için de geçerlidir.
Yük
  • libRSCpuRef paylaşılan nesneyi yükler. Bu arayüzde değişiklik olması durumunda HAL sürümünün yükseltilmesi gerekir.
  • Satıcılar, paylaşılan nesneyi yüklemek için ya libRSCpuRef güvenecek ya da kendi nesnelerini uygulayacaktır.

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:

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

Şekil 8. Satıcı sürücüsündeki değişiklikler
  1. libclcore.bc /vendor bölümüne kopyalayın. Bu, libclcore.bc , libLLVM.so ve libbcc.so senkronize olmasını sağlar.
  2. RS HAL uygulamasından RsdCpuScriptImpl::BCC_EXE_PATH ayarını yaparak bcc 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:

  1. product_SHIPPING_API_LEVEL 26'dan düşük.
  2. product_FULL_TREBLE_OVERRIDE tanımlı değil.

Eski cihazlar için, Android 8.0 ve sonraki sürümlere yükseltme yapılırken 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: