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 |
---|---|
|
|
إعداد مساحة اسم الرابط
قيد الربط الذي يمنع استخدام 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 ثم dlopen
s libRS_internal.so
في نطاق آخر
مساحة اسم الرابط rs
.
يمكن للمورّدين توفير برنامج تشغيل RS خاص بهم من خلال وضع علامة وقت الإصدار
OVERRIDE_RS_DRIVER
، مضمّنة في RS HAL
التنفيذ
(hardware/interfaces/renderscript/1.0/default/Context.cpp
). هذا النمط
ثم dlopen
ed من اسم برنامج التشغيل لسياق 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 على ثلاث مراحل:
المرحلة | التفاصيل |
---|---|
تجميع |
|
الرابط |
|
تحميل |
|
بالإضافة إلى 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 لبرنامج التشغيل المورد بطريقتين:
- استدعاء المحول البرمجي لـ RenderScript الخاص بالمورّد في
/vendor/bin/
(الطريقة المفضلة لتجميع وحدة معالجة الرسومات). على غرار وحدات برنامج التشغيل الأخرى، لا يمكن أن يعتمد البرنامج الثنائي لبرنامج التحويل البرمجي للبائع على أي مكتبة نظام غير موجودة في قائمة ملفات RenderScript libs المتاحة للمورّدين. - استدعاء نسخة مخفية الوجهة من النظام:
/system/bin/bcc
مع الحقل الذي قدّمه المورّدbcc plugin
؛ فإن هذا المكون الإضافي لا يمكن أن يعتمد على أي مكتبة نظام غير مدرج في قائمة تتوفر libs بلغة RenderScript للمورّدين
إذا كان المورّد bcc plugin
بحاجة إلى التداخل مع وحدة المعالجة المركزية (CPU)
لا يمكن أن يكون التحويل البرمجي واعتماده على libLLVM.so
بسهولة
تمت إزالتها، على المورِّد نسخ bcc
(وجميع ملفات البيانات التي لا تكون بتنسيق LL-NDK
والتبعيات، بما في ذلك libLLVM.so
وlibbcc.so
) في
قسم /vendor
.
بالإضافة إلى ذلك، على المورّدين إجراء التغييرات التالية:
الشكل 7. التغييرات في برنامج تشغيل المورِّد
- انسخ
libclcore.bc
إلى قسم/vendor
. هذا النمط لضمانlibclcore.bc
وlibLLVM.so
تمت مزامنةlibbcc.so
. - تغيير المسار إلى
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
الأجهزة القديمة
الأجهزة القديمة هي الأجهزة التي تستوفي الشروط التالية:
- PRODUCT_SHIPPING_API_LEVEL أقل من 26.
- لم يتم تحديد PRODUCT_FULL_TREBLE_OVERRIDE.
بالنسبة إلى الأجهزة القديمة، لا يتم فرض القيود عند الترقية إلى
الإصدار 8.0 من نظام Android والإصدارات الأحدث، ما يعني أنّ برامج التشغيل لا تزال مرتبطة بالمكتبات
في /system/lib[64]
. ومع ذلك، بسبب تغيير البنية
المرتبطة بـ OVERRIDE_RS_DRIVER
،
يجب تثبيت android.hardware.renderscript@1.0-impl
على
قسم /vendor
يؤدي عدم تنفيذ ذلك إلى فرض وقت تشغيل RenderScript.
إلى مسار وحدة المعالجة المركزية.
للحصول على معلومات حول الدافع لإيقاف Renderscript نهائيًا، يُرجى الاطّلاع على صفحة "مطوّرو تطبيقات Android". المدوّنة: مستقبل الحوسبة الخاصة بوحدة معالجة الرسومات على نظام التشغيل Android تشمل معلومات المصادر الخاصة بعملية الإيقاف هذه ما يلي:
- نقل البيانات من Renderscript
- نموذج RenderScriptMigration
- مجموعة أدوات الاستبدال من Intrinsics README
- الاستبدال الأساسيToolkit.kt