لغة RenderScript

RenderScript هو إطار عمل لتشغيل عمليات حسابية مكثفة بأداء مهام عالية على Android وهي مصممة للاستخدام مع العملية الحسابية المتوازية، على الرغم من أنّ أعباء العمل التسلسلية يمكن أن تستفيد أيضًا. تشير رسالة الأشكال البيانية يوازي وقت تشغيل RenderScript العمل عبر معالِجات العمل المتاحة على مثل وحدات المعالجة المركزية متعددة النواة ووحدات معالجة الرسومات، مما يتيح للمطوّرين التركيز على التعبير عن الخوارزميات بدلاً من جدولة العمل. يتميّز RenderScript بشكل خاص تطبيقات معالجة الصور، والعمليات الحسابية أو التصوير الفوتوغرافي أو رؤية الكمبيوتر.

تستخدم الأجهزة التي تعمل بنظام التشغيل Android 8.0 والإصدارات الأحدث برنامج RenderScript التالي إطار العمل وHALs للبائع:

الشكل 1. رمز المورّد الذي يتم ربطه بملفات تعريف الارتباط الداخلية

تشمل الاختلافات عن RenderScript في الإصدار 7.x والإصدارات الأقدم من نظام التشغيل Android ما يلي:

  • مثيلان من RenderScript libs الداخلية في إحدى العمليات. مجموعة واحدة مخصصة المسار الاحتياطي لوحدة المعالجة المركزية (CPU) ويقع من /system/lib مباشرةً الآخر مخصصة لمسار وحدة معالجة الرسومات وهي من /system/lib/vndk-sp.
  • يتم إنشاء مكتبات RS الداخلية في /system/lib كجزء من ويتم تحديثها عند ترقية system.img. ومع ذلك، libs في /system/lib/vndk-sp للمورِّد ولا يتم تحديثها عند ترقية system.img (بينما يمكن تحديثها.) لإصلاح الأمان، تظل واجهة التطبيق الثنائية (ABI) كما هي).
  • رمز المورّد (RS HAL، وبرنامج تشغيل RS، وbcc plugin) هي المرتبطة بمكتبات RenderScript الداخلية الموجودة على /system/lib/vndk-sp لا يمكن الربط مع libs في /system/lib لأن libs في هذا الدليل تكون مخصصة لـ وبالتالي قد لا تتوافق مع رمز البائع (أي الرموز ). فقد يؤدي فعل ذلك إلى استحالة الحصول على اتصال عبر الهواء المستند إلى إطار عمل فقط.

التصميم

توضِّح الأقسام التالية تفاصيل تصميم RenderScript في الإصدار 8.0 من نظام Android والإصدارات الأحدث.

ملفات RenderScript libs المتاحة للمورّدين

يسرد هذا القسم ملفات libs لـ RenderScript (المعروفة باسم Vendor NDK for Same-Process. HALs أو VNDK-SP) المتوفرة لرمز البائع ويمكن ربطها ضد. كما يعرض تفاصيل المكتبات الإضافية غير المرتبطة RenderScript، ولكن يتم توفيرها أيضًا مع الرمز البرمجي للمورّد.

على الرغم من أنّ قائمة المكتبات التالية قد تختلف بين إصدارات Android، تكون غير قابلة للتغيير مع إصدار Android معيّن، للحصول على قائمة حديثة من المكتبات المتوفرة، يمكنك الرجوع إلى /system/etc/ld.config.txt.

مكتبات RenderScript مكتبات غير RenderScript
  • 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

إعداد مساحة اسم الرابط

قيد الربط الذي يمنع استخدام libs غير الموجودة في VNDK-SP من قِبل يتم فرض رمز البائع في وقت التشغيل باستخدام مساحة اسم الرابط. (لمزيد من التفاصيل، يمكنك الرجوع إلى تصميم VNDK عرض تقديمي).

على جهاز يعمل بالإصدار 8.0 من نظام التشغيل Android أو إصدار أحدث، تكون جميع طبقات HALs المعالجة نفسها (SP-HALs) يتم تحميل باستثناء RenderScript داخل مساحة اسم الرابط sphal يتم تحميل RenderScript في ملف خاص بـ RenderScript مساحة الاسم rs، وهي موقع يتيح خيارات أكثر تساهلًا تنفيذ libs لـ RenderScript. نظرًا لأنه يجب تحميل تنفيذ RS كود البت الذي تم تجميعه، تتم إضافة /data/*/*.so إلى مسار مساحة الاسم rs (لا يُسمح لـ SP-HALs الأخرى بتحميل libs من قسم البيانات).

بالإضافة إلى ذلك، تسمح مساحة الاسم rs بتنسيق libs أكثر مما هو مُقدّم بمساحات أسماء أخرى. libmediandk.so وlibft2.so تعرضت لمساحة الاسم rs بسبب لدى libRS_internal.so تبعية داخلية إلى هذه المكتبات.

الشكل 2. إعداد مساحة الاسم لرابط الرابط

تحميل برامج التشغيل

مسار وحدة المعالجة المركزية الاحتياطية

اعتمادًا على وجود وحدة بت RS_CONTEXT_LOW_LATENCY عند إنشاء سياق RS، يتم تحديد إما مسار وحدة المعالجة المركزية (CPU) أو مسار وحدة معالجة الرسومات. عندما تم اختيار مسار وحدة المعالجة المركزية (CPU)، libRS_internal.so (طريقة التنفيذ الرئيسية). من إطار عمل RS) تتم dlopenمباشرةً من أداة الربط التلقائية الذي يتم فيه توفير إصدار النظام الأساسي من RS libs.

لا يتم استخدام تطبيق RS HAL من المورد على الإطلاق عندما تكون وحدة المعالجة المركزية (CPU) يتمّ استخدام مسار احتياطي، ويتمّ إنشاء عنصر RsContext باستخدام mVendorDriverName فارغ. libRSDriver.so هو (من قِبل افتراضي) dlopenويتم تحميل مكتبة برنامج التشغيل من مساحة الاسم default لأن المتصل (libRS_internal.so) يتم تحميله أيضًا في default مساحة الاسم.

الشكل 3. المسار الاحتياطي لوحدة المعالجة المركزية (CPU).

مسار وحدة معالجة الرسومات

بالنسبة إلى مسار وحدة معالجة الرسومات، يتم تحميل libRS_internal.so بشكل مختلف. أولاً، يستخدم libRS.so android.hardware.renderscript@1.0.so (والعناصر الأساسية فيها libhidltransport.so) للتحميل android.hardware.renderscript@1.0-impl.so (مورِّد تنفيذ RS HAL) في مساحة اسم رابط مختلفة تسمى sphal صربيا HAL ثم dlopens libRS_internal.so في نطاق آخر مساحة اسم الرابط rs.

يمكن للمورّدين توفير برنامج تشغيل RS خاص بهم من خلال وضع علامة وقت الإصدار OVERRIDE_RS_DRIVER، مضمّنة في RS HAL التنفيذ (hardware/interfaces/renderscript/1.0/default/Context.cpp). هذا النمط ثم dlopened من اسم برنامج التشغيل لسياق RS لمسار وحدة معالجة الرسومات.

تم تفويض إنشاء الكائن RsContext إلى RS HAL. التنفيذ. تستدعي طبقة تجريد الأجهزة (HAL) إطار عمل RS باستخدام دالة rsContextCreateVendor() باسم برنامج التشغيل إلى استخدامها كوسيطة. ومن ثم يقوم إطار عمل RS بتحميل برنامج التشغيل المحدد عند تم إعداد RsContext. في هذه الحالة، يتم تخزين مكتبة السائق تم تحميلها في مساحة الاسم rs لأنّ السمة RsContext داخل مساحة الاسم rs توجد /vendor/lib في مسار البحث لمساحة الاسم.

الشكل 4. المسار الاحتياطي لوحدة معالجة الرسومات.

عند الانتقال من مساحة الاسم default إلى مساحة الاسم sphal، يستخدم libhidltransport.so android_load_sphal_library() لترتيب رابط ديناميكي لتحميل مكتبة -impl.so من مساحة الاسم sphal

عند الانتقال من مساحة الاسم sphal إلى مساحة الاسم rs، يتم التحميل بشكل غير مباشر من خلال السطر التالي في /system/etc/ld.config.txt:

namespace.sphal.link.rs.shared_libs = libRS_internal.so

يحدّد هذا السطر أنّه يجب تحميل الرابط الديناميكي. libRS_internal.so من مساحة الاسم rs عند كتابة lib لا يمكن العثور عليه من مساحة الاسم sphal (والتي تكون دائمًا الحالة لأنّ مساحة الاسم sphal لا تبحث /system/lib/vndk-sp حيث libRS_internal.so ). باستخدام هذه الإعدادات، يمكن استدعاء dlopen() بسيطة إلى تكفي libRS_internal.so لنقل مساحة الاسم.

تحميل المكوّن الإضافي "نسخة مخفية الوجهة"

bcc plugin هي مكتبة يوفّرها المورّد ويتم تحميلها في برنامج التجميع العنقودي bcc. ولأنّ bcc هي عملية نظام في دليل /system/bin، فيمكن تحديد مكتبة bcc plugin تعتبر SP-HAL (أي HAL للمورّد الذي يمكن تحميله مباشرة في نظام التشغيل بدون الحاجة إلى الدمج). باعتباره SP-HAL، مكتبة bcc-plugin:

  • لا يمكن الربط بمكتبات إطار العمل فقط مثل libLLVM.so
  • يمكن الربط بمكتبات VNDK-SP فقط المتاحة للمورِّد.

يتم فرض هذا القيد من خلال تحميل bcc plugin في مساحة الاسم sphal باستخدام android_sphal_load_library(). في الإصدارات السابقة من في Android، تم تحديد اسم المكوِّن الإضافي باستخدام الخيار -load وكذلك تم تحميل lib باستخدام الدالة dlopen() البسيطة من خلال libLLVM.so في الإصدار Android 8.0 والإصدارات الأحدث، يتم تحديد ذلك في -plugin ويتم تحميل lib مباشرةً عن طريق bcc نفسه يتيح هذا الخيار مسارًا غير خاص بنظام Android مشروع LLVM مفتوح المصدر.

الشكل 5. جارٍ تحميل المكوّن الإضافي "نسخة مخفية الوجهة"، الإصدار 7.x من نظام Android والإصدارات الأقدم.



الشكل 6. جارٍ تحميل المكوّن الإضافي "نسخة مخفية الوجهة"، الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث.

مسارات البحث عن ld.mc

عند تنفيذ ld.mc، يتم تقديم بعض حزم وقت تشغيل RS كمدخلات. إلى الرابط. يتم ربط رمز بت RS من التطبيق مع libs لوقت التشغيل وعند تحميل رمز البت المحوَّل إلى إحدى عمليات التطبيق، تعمل libs في بيئة التشغيل تكون مرتبطة بشكل ديناميكي مجددًا من رمز البت المحوَّل.

تتضمن libs بيئة التشغيل ما يلي:

  • libcompiler_rt.so
  • libm.so
  • libc.so
  • برنامج تشغيل RS (إما libRSDriver.so أو OVERRIDE_RS_DRIVER)

عند تحميل كود البت الذي تم تجميعه في عملية التطبيق، قدم نفس تم استخدامه من قِبل ld.mc. وبخلاف ذلك، يتم تجميع كود البت قد لا يتمكنون من العثور على الرمز الذي كان متاحًا عند ربطه.

ولإجراء ذلك، يستخدم إطار العمل RS مسارات بحث مختلفة لملفات libs في بيئة التشغيل عندما يتم تنفيذ ld.mc، بناءً على ما إذا كان إطار عمل RS نفسه تم تحميلها من /system/lib أو من /system/lib/vndk-sp. ويمكن تحديد ذلك من خلال قراءة عنوان أحد الرموز العشوائية للصراع (RS). lib ضمن إطار العمل واستخدام dladdr() لتحديد مسار الملف العنوان.

سياسة SELinux

نتيجة لتغييرات سياسة SELinux في الإصدار 8.0 من نظام Android والإصدارات الأحدث، يجب اتّباع قواعد محدّدة (يتم تنفيذها من خلال neverallows) عند تصنيف الملفات الإضافية في القسم vendor:

  • يجب أن يكون vendor_file هو التصنيف التلقائي لكل الملفات في قسم vendor. وتتطلّب سياسة المنصة هذا الإذن للوصول إلى عمليات تطبيق HAL العبور.
  • تمت إضافة جميع exec_types الجديدة في القسم vendor. يجب أن يحتوي SEPolicy على المورد على السمة vendor_file_type. يتم فرض ذلك من خلال neverallows.
  • لتجنُّب التضارب مع التحديثات المستقبلية للأنظمة الأساسية/الإطار، تجنَّب تصنيف المحتوى ملفات بخلاف exec_types في قسم vendor.
  • يجب أن تكون جميع تبعيات المكتبة لـ HALs للعملية نفسها التي يحددها AOSP الذي يحمل التصنيف same_process_hal_file.

للحصول على تفاصيل عن سياسة SELinux، يمكنك الاطّلاع على نظام التشغيل Linux المحسّن للأمان في Android

توافق ABI مع رمز بت

في حالة عدم إضافة واجهات برمجة تطبيقات جديدة، مما يعني عدم حدوث تعارض في إصدار HAL، فإن أطر عمل RS مواصلة استخدام برنامج تشغيل وحدة معالجة الرسومات (HAL 1.0) الحالي.

بالنسبة إلى التغييرات الطفيفة على HAL (HAL 1.1) التي لا تؤثر في رمز البت، يجب أن تكون أطر العمل الرجوع إلى وحدة المعالجة المركزية (CPU) لواجهات برمجة التطبيقات المضافة حديثًا ومواصلة استخدام برنامج تشغيل وحدة معالجة الرسومات (HAL 1.0) في مكان آخر.

بالنسبة إلى تغييرات HAL الرئيسية (HAL 2.0) التي تؤثر في تجميع/ربط رموز البت، RS أن تختار أطر العمل عدم تحميل برامج تشغيل وحدة معالجة الرسومات التي يوفرها المورد تستخدم مسار وحدة المعالجة المركزية (CPU) أو مسار Vulkan للتسريع.

يتم استخدام رمز البت RenderScript على ثلاث مراحل:

المرحلة التفاصيل
تجميع
  • يجب أن يكون رمز بت الإدخال (bc.) لـ bcc في يجب أن يكون تنسيق رمز البت LLVM 3.2 وbcc للخلف. يتوافق مع التطبيقات الحالية (القديمة).
  • ومع ذلك، قد تتغير البيانات الوصفية في .bc (قد تكون هناك بيئة تشغيل جديدة الدوال، مثل أدوات تحديد التخصيص ∓ والدوال الرياضية وما إلى ذلك). الجزء من دوال بيئة التشغيل في libclcore.bc، جزء منها تتواجد في LibRSDriver أو ما يعادله من بائع.
  • تتطلب دوال بيئة التشغيل الجديدة أو التغييرات التي قد تؤدي إلى تلف البيانات الوصفية زيادة مستوى واجهة برمجة تطبيقات رمز Bitcode. ولأن سائقي البائعين لن يتمكنوا من استهلاكه، يجب أيضًا زيادة إصدار HAL.
  • قد يكون لدى البائعين برامج التجميع الخاصة بهم، لكن الاستنتاجات/المتطلبات لـ bcc تنطبق أيضًا على هذه التجميعات.
الرابط
  • سيتم ربط ملف .o الذي تم تجميعه ببرنامج تشغيل البائع، على سبيل المثال، "libRSDriver_foo.so" وlibcompiler_rt.so" وحدة المعالجة المركزية (CPU) بـ libRSDriver.so.
  • إذا كان .o يتطلّب واجهة برمجة تطبيقات جديدة لبيئة التشغيل من libRSDriver_foo، يجب تحديث برنامج تشغيل البائع لدعمه.
  • قد يكون لبعض الموردين روابط خاصة بهم، ولكن الوسيطة تنطبق ld.mc عليها أيضًا.
تحميل
  • يحمّل libRSCpuRef العنصر المشترَك. إذا كانت هناك تغييرات على هذه الواجهة، يلزم وجود اصطدام بإصدار HAL.
  • يعتمد المورّدون إمّا على libRSCpuRef لتحميل أو تنفيذ أهدافها الخاصة.

بالإضافة إلى HAL، تتم أيضًا إضافة واجهات برمجة التطبيقات لوقت التشغيل والرموز التي يتم تصديرها. من الواجهات. لم يطرأ أي تغيير على أيّ من الواجهتين منذ الإصدار Android 7.0 (API 24) وما زالت حتى الآن لا نخطط فورية لتغييرها في الإصدار 8.0 من Android والإصدارات الأحدث. ومع ذلك، إذا كانت تغيرت واجهة المستخدم، فسيزيد إصدار HAL أيضًا.

عمليات التنفيذ من قِبل المورّدين

يتطلب الإصدار Android 8.0 والإصدارات الأحدث بعض التغييرات في برنامج تشغيل وحدة معالجة الرسومات لبرنامج تشغيل وحدة معالجة الرسومات يعمل بشكل صحيح.

وحدات برامج التشغيل

  • يجب ألا تعتمد وحدات برامج التشغيل على أي مكتبات نظام غير موجودة في القائمة.
  • يجب أن يقدّم السائق المعلومات الخاصة به android.hardware.renderscript@1.0-impl_{NAME}، أو الإفصاح عن التنفيذ التلقائي android.hardware.renderscript@1.0-impl باعتباره وتبعيتها.
  • ويُعدّ تنفيذ وحدة المعالجة المركزية (CPU) libRSDriver.so مثالاً جيدًا على كيفية إزالة التبعيات غير التابعة لـ VNDK-SP.

محول رمز Bitcode

يمكنك تجميع رمز البت RenderScript لبرنامج التشغيل المورد بطريقتين:

  1. استدعاء المحول البرمجي لـ RenderScript الخاص بالمورّد في /vendor/bin/ (الطريقة المفضلة لتجميع وحدة معالجة الرسومات). على غرار وحدات برنامج التشغيل الأخرى، لا يمكن أن يعتمد البرنامج الثنائي لبرنامج التحويل البرمجي للبائع على أي مكتبة نظام غير موجودة في قائمة ملفات RenderScript libs المتاحة للمورّدين.
  2. استدعاء نسخة مخفية الوجهة من النظام: /system/bin/bcc مع الحقل الذي قدّمه المورّد bcc plugin؛ فإن هذا المكون الإضافي لا يمكن أن يعتمد على أي مكتبة نظام غير مدرج في قائمة تتوفر libs بلغة RenderScript للمورّدين

إذا كان المورّد bcc plugin بحاجة إلى التداخل مع وحدة المعالجة المركزية (CPU) لا يمكن أن يكون التحويل البرمجي واعتماده على libLLVM.so بسهولة تمت إزالتها، على المورِّد نسخ bcc (وجميع ملفات البيانات التي لا تكون بتنسيق LL-NDK والتبعيات، بما في ذلك libLLVM.so وlibbcc.so) في قسم /vendor.

بالإضافة إلى ذلك، على المورّدين إجراء التغييرات التالية:

الشكل 7. التغييرات في برنامج تشغيل المورِّد

  1. انسخ libclcore.bc إلى قسم /vendor. هذا النمط لضمان libclcore.bc وlibLLVM.so تمت مزامنة libbcc.so.
  2. تغيير المسار إلى bcc القابل للتنفيذ من خلال الإعداد RsdCpuScriptImpl::BCC_EXE_PATH من تنفيذ RS HAL.

سياسة SELinux

تؤثر سياسة SELinux على الملفات التنفيذية لكل من برنامج التشغيل والمحول البرمجي. الكل يجب تصنيف وحدات برامج التشغيل باعتبارها same_process_hal_file في file_contexts للجهاز. مثلاً:

/vendor/lib(64)?/libRSDriver_EXAMPLE\.so     u:object_r:same_process_hal_file:s0

يجب أن يكون بالإمكان استدعاء برنامج التجميع القابل للتنفيذ من خلال عملية في التطبيق، كما هو الحال نسخة المورّد من نسخة مخفية الوجهة (/vendor/bin/bcc). مثل:

device/vendor_foo/device_bar/sepolicy/file_contexts:
/vendor/bin/bcc                    u:object_r:same_process_hal_file:s0

الأجهزة القديمة

الأجهزة القديمة هي الأجهزة التي تستوفي الشروط التالية:

  1. PRODUCT_SHIPPING_API_LEVEL أقل من 26.
  2. لم يتم تحديد PRODUCT_FULL_TREBLE_OVERRIDE.

بالنسبة إلى الأجهزة القديمة، لا يتم فرض القيود عند الترقية إلى الإصدار 8.0 من نظام Android والإصدارات الأحدث، ما يعني أنّ برامج التشغيل لا تزال مرتبطة بالمكتبات في /system/lib[64]. ومع ذلك، بسبب تغيير البنية المرتبطة بـ OVERRIDE_RS_DRIVER، يجب تثبيت android.hardware.renderscript@1.0-impl على قسم /vendor يؤدي عدم تنفيذ ذلك إلى فرض وقت تشغيل RenderScript. إلى مسار وحدة المعالجة المركزية.

للحصول على معلومات حول الدافع لإيقاف Renderscript نهائيًا، يُرجى الاطّلاع على صفحة "مطوّرو تطبيقات Android". المدوّنة: مستقبل الحوسبة الخاصة بوحدة معالجة الرسومات على نظام التشغيل Android تشمل معلومات المصادر الخاصة بعملية الإيقاف هذه ما يلي: