يعالج الرابط الديناميكي تحديين في تصميم Treble VNDK:
- يتم تحميل المكتبات المشتركة لـ SP-HAL وبرامجها الملحقة، بما في ذلك مكتبات VNDK-SP ، في عمليات إطار العمل. من المفترض أن تكون هناك بعض الآليات لمنع تعارض الرموز.
- يمكن أن تؤدي
dlopen()
وandroid_dlopen_ext()
إلى إدخال بعض التبعيات أثناء التشغيل التي لا تظهر في وقت الإنشاء ويمكن أن يكون من الصعب رصدها باستخدام التحليل الثابت.
ويمكن حل هذين التحديين باستخدام آلية مساحة اسم الرابط. توفّر هذه الآلية أداة الربط الديناميكي. ويمكنه عزل المكتبات المشتركة في مساحات أسماء مختلفة لرابط البرامج حتى لا تتصادم المكتبات التي تحمل اسم المكتبة نفسه ولكن برموز مختلفة.
من ناحية أخرى، توفّر آلية مساحة اسم الرابط المرونة كي يتم تصدير بعض المكتبات المشتركة من خلال مساحة اسم رابط واستخدامها من قِبل مساحة اسم رابط أخرى. يمكن أن تصبح هذه المكتبات المشتركة المصدَّرة واجهات برمجة تطبيقات علنية للبرامج الأخرى مع إخفاء تفاصيل تنفيذها ضمن مساحات أسماء الرابط.
على سبيل المثال، /system/lib[64]/libcutils.so
و/system/lib[64]/vndk-sp-${VER}/libcutils.so
هما مكتبتي
مشتركتان. يمكن أن يكون لهاتين المكتبتين رموز مختلفة. ويتم تحميلها
في مساحات أسماء مختلفة لرابط الربط حتى تتمكّن وحدات إطار العمل من الاعتماد على
/system/lib[64]/libcutils.so
ويمكن للمكتبات المشتركة لـ SP-HAL الاعتماد على
/system/lib[64]/vndk-sp-${VER}/libcutils.so
.
من ناحية أخرى، /system/lib[64]/libc.so
هو مثال على
مكتبة عامة تم تصديرها من خلال مساحة اسم رابط واستيرادها إلى
مساحات أسماء روابط متعددة. يتم تحميل تبعيات
/system/lib[64]/libc.so
، مثل libnetd_client.so
،
في مساحة الاسم التي تقع فيها /system/lib[64]/libc.so
. ولن تتمكن مساحات الاسماء الأخرى من الوصول إلى هذه التبعيات. وتلخّص هذه المحاولة
تفاصيل التنفيذ مع توفير الواجهات
العامة.
آلية العمل
يكون الرابط الديناميكي مسؤولاً عن تحميل المكتبات المشتركة المحدّدة
في إدخالات DT_NEEDED
أو المكتبات المشتركة المحدّدة باستخدام الوسيطة
dlopen()
أو android_dlopen_ext()
. في كلا القصتين، يعثر الرابط الديناميكي على مساحة أسماء الرابط التي يقيم فيها المُدخِل ويحاول تحميل التبعيات في مساحة أسماء الرابط نفسها. إذا
تعذّر على الرابط الديناميكي تحميل المكتبة المشترَكة في مساحة اسم الرابط
المحدّدة، يطلب من مساحة اسم الرابط المرتبط المكتبات المشترَكة التي تم تصديرها.
تنسيق ملف الإعداد
يستند تنسيق ملف الإعداد إلى تنسيق ملف INI. يظهر ملف الإعدادات المعتاد على النحو التالي:
dir.system = /system/bin dir.system = /system/xbin dir.vendor = /vendor/bin [system] additional.namespaces = sphal,vndk namespace.default.isolated = true namespace.default.search.paths = /system/${LIB} namespace.default.permitted.paths = /system/${LIB}/hw namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB} namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw namespace.sphal.isolated = true namespace.sphal.visible = true namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB} namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB} namespace.sphal.asan.search.paths = /data/asan/odm/${LIB}:/odm/${LIB} namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB} namespace.sphal.asan.permitted.paths = /data/asan/odm/${LIB}:/odm/${LIB} namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB} namespace.sphal.links = default,vndk namespace.sphal.link.default.shared_libs = libc.so:libm.so namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so namespace.vndk.isolated = true namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29 namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29 namespace.vndk.links = default namespace.vndk.link.default.shared_libs = libc.so:libm.so [vendor] namespace.default.isolated = false namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}
يتضمّن ملف الضبط ما يلي:
- تتوفّر عدة خصائص لربط قسم الدليل في بداية الرابط الديناميكي لاختيار القسم الفعّال.
-
عدة أقسام لإعداد مساحات أسماء الروابط:
- يحتوي كل قسم على عدة مساحات أسماء (رؤوس الرسم البياني) وعدة روابط احتياطية بين مساحات الأسماء (أقواس الرسم البياني).
- لكل مساحة اسم إعدادات عزل ومسارات بحث ومسارات مسموح بها وإعدادات مستوى العرض.
توضّح الجداول أدناه معنى كل سمة بالتفصيل.
سمة ربط قسم الدليل
الخاصية | الوصف | مثال |
---|---|---|
|
مسار إلى دليل ينطبق عليه القسم تربط كل خاصية ملفات التشغيل ضمن الدليل بقسم إعدادات مساحات أسماء
الربط. قد تكون هناك موقعان (أو أكثر)
يتضمّنان |
يشير ذلك إلى أنّ الإعدادات المحدّدة في القسم
تنطبق الإعدادات المحدّدة في قسم |
سمات العلاقة
الخاصية | الوصف | مثال |
---|---|---|
additional. |
قائمة مفصولة بفواصل لمساحات أسماء إضافية (بالإضافة إلى مساحة الاسم
|
يشير ذلك إلى أنّ هناك ثلاث مساحات أسماء ( |
namespace. |
قائمة مفصولة بفواصل تضمّ مساحات الاسماء البديلة إذا تعذّر العثور على مكتبة مشترَكة في مساحة الاسم الحالية، يحاول الرابط الديناميكيتحميل المكتبة المشترَكة من مساحات الأسماء الاحتياطية. يكون لمساحة имен المحدّدة في بداية القائمة أولوية أعلى. |
إذا طلبت مكتبة مشترَكة أو ملف قابل للتنفيذ مكتبة مشترَكة
لا يمكن تحميلها إلى مساحة الاسم بعد ذلك، إذا تعذّر تحميل المكتبة المشتركة من مساحة الاسم أخيرًا، إذا فشلت كل المحاولات، يعرض الرابط الديناميكي خطأً. |
namespace. |
قائمة مفصولة بنقطتَين رأسيتين للمكتبات المشتركة التي يمكن البحث عنها في مساحات أسماء
لا يمكن استخدام هذا الموقع الإلكتروني مع
|
ويشير ذلك إلى أنّ الرابط الاحتياطي يقبل فقط |
namespace. |
قيمة منطقية تشير إلى ما إذا كان يمكن
البحث في جميع المكتبات المشتركة في مساحة الاسم لا يمكن استخدام هذا الموقع الإلكتروني مع
|
يشير ذلك إلى أنّه يمكن لكل أسماء المكتبات الوصول إلى الرابط الاحتياطي من |
سمات مساحة الاسم
الخاصية | الوصف | مثال |
---|---|---|
namespace. |
قيمة منطقية تشير إلى ما إذا كان يجب على الرابط الديناميكي التحقّق من مكان مكتبة التطبيقات المشتركة. إذا كان إذا كان |
يشير ذلك إلى أنّه لا يمكن سوى تحميل المكتبات المشتركة في
|
namespace. |
قائمة مفصولة بنقطتَين رأسيتين للملفات الدليلية للبحث عن المكتبات المشتركة يتمّ إدراج الدلائل المحدّدة في إذا كانت قيمة على سبيل المثال، إذا كان |
يشير ذلك إلى أنّ أداة الربط الديناميكي تبحث في |
namespace. |
قائمة مفصولة بنقطتَين رأسيتين للمجلدات للبحث عن المكتبات المشتركة عند تفعيل AddressSanitizer (ASan) يتم تجاهل |
يشير ذلك إلى أنّه عند
تفعيل ASan، يبحث الرابط الديناميكي عن |
namespace. |
قائمة مفصولة بنقطتَين رأسيتين بالمجلدات (بما في ذلك المجلدات الفرعية) التي
يمكن للرابط الديناميكي تحميل المكتبات المشتركة فيها (بالإضافة إلى
يمكن أيضًا تحميل المكتبات المشتركة ضمن الأدلة الفرعية لملف إذا كان |
ويشير ذلك إلى أنّه يمكن تحميل المكتبات المشتركة ضمن على سبيل المثال، بدون |
namespace. |
قائمة مفصولة بنقطتَين للأدلّة التي يمكن للرابط الديناميكي تحميل المكتبات المشتركة فيها عند تفعيل ASan يتم تجاهل |
يشير ذلك إلى أنّه عند تفعيل ASan،
يمكن تحميل المكتبات المشتركة ضمن |
namespace. |
قيمة منطقية تشير إلى ما إذا كان بإمكان البرنامج (باستثناء
إذا كانت قيمة إذا كانت قيمة |
ويشير ذلك إلى أنّ |
إنشاء مساحة اسم الرابط
في Android 11، يتم إنشاء إعدادات الرابط أثناء التشغيل ضمن
/linkerconfig
بدلاً من استخدام ملفات نص عادي في
${android-src}/system/core/rootdir/etc
. يتم إنشاء الإعدادات عند التمهيد
استنادًا إلى بيئة التشغيل التي تتضمّن العناصر التالية:
- إذا كان الجهاز متوافقًا مع حزمة VNDK
- إصدار VNDK المستهدف في قسم المورّد
- إصدار حزمة VNDK لقسم المنتج
- وحدات APEX المثبَّتة
يتم إنشاء إعدادات الرابط من خلال حلّ التبعيات بين مساحات أسماء الرابط. على سبيل المثال، إذا كانت هناك أي تعديلات على وحدات APEX تتضمّن تعديلات على التبعيات، يتم إنشاء إعدادات
الرابط لتعكس هذه التغييرات. يمكن العثور على مزيد من التفاصيل لإنشاء إعدادات الرابط في
${android-src}/system/linkerconfig
.
عزل مساحة اسم أداة الربط
هناك ثلاثة أنواع من الإعدادات. استنادًا إلى قيمة
PRODUCT_TREBLE_LINKER_NAMESPACES
و
BOARD_VNDK_VERSION
في BoardConfig.mk
، يتم إنشاء
الإعدادات المقابلة في وقت التشغيل.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
الإعدادات المحدّدة | متطلبات فحص الفيديوهات |
---|---|---|---|
true |
current |
VNDK |
مطلوب للأجهزة التي تم تشغيلها باستخدام الإصدار 9 من نظام التشغيل Android أو إصدار أحدث |
فارغ | VNDK Lite |
مطلوب للأجهزة التي تم تشغيلها باستخدام الإصدار 8.x من نظام التشغيل Android | |
false |
فارغ | Legacy |
بالنسبة إلى الأجهزة غير المزوّدة بتطبيق Treble |
تعمل إعدادات VNDK Lite على عزل مكتبتَي SP-HAL وVNDK-SP المشتركة. في Android 8.0، يجب أن يكون
هذا الملف هو ملف الإعدادات الخاص بالرابط الديناميكي عندما يكون
PRODUCT_TREBLE_LINKER_NAMESPACES
هو true
.
تعمل إعدادات VNDK أيضًا على عزل مكتبتَي SP-HAL وVNDK-SP المشتركة. بالإضافة إلى ذلك، يوفر هذا الإعداد عزلًا كاملاً لبرنامج الربط الديناميكي. ويضمن ذلك أنّ الوحدات في قسم النظام لن تعتمد على مكتبات المشترَكة في أقسام المورّدين والعكس صحيح.
في الإصدار 8.1 من نظام التشغيل Android أو الإصدارات الأحدث، يكون إعداد VNDK هو الإعداد التلقائي، ويُنصح بشدة بتفعيل عزل الرابط الديناميكي بالكامل من خلال ضبط قيمة BOARD_VNDK_VERSION
على current
.
ضبط مجموعة تطوير البرامج الأصلية للمورّدين (VNDK)
تعمل تهيئة VNDK على عزل تبعيات المكتبة المشتركة بين قسم النظام وأقسام البائع. مقارنةً بالتهيئات المذكورة في القسم الفرعي السابق، يتم توضيح الاختلافات على النحو التالي:
-
عمليات الإطار
- يتم إنشاء مساحات الاسماء
default
وvndk
وsphal
وrs
. - يتم عزل جميع مساحات الأسماء.
- يتم تحميل المكتبات المشتركة للنظام في مساحة الاسم
default
. - يتم تحميل رموز SP-HAL في مساحة الاسم
sphal
. - مكتبات VNDK-SP المشتركة التي تم تحميلها إلى مساحة الاسم
vndk
- يتم إنشاء مساحات الاسماء
-
عمليات المورّدين
- يتم إنشاء مساحات الاسم
default
وvndk
وsystem
. - مساحة الاسم
default
معزولة. - يتم تحميل المكتبات المشتركة الخاصة بالمورّدين في مساحة الاسم
default
. - يتم تحميل مكتبتَي VNDK وVNDK-SP المشترَكتَين في مساحة الاسم
vndk
. - يتم تحميل LL-NDK وتبعياته في مساحة الاسم
system
.
- يتم إنشاء مساحات الاسم
توضِّح الصورة أدناه العلاقة بين مساحات أسماء الرابط.
الشكل 1: عزل مساحة اسم الرابط (إعدادات VNDK)
في الصورة أعلاه، يشير LL-NDK وVNDK-SP إلى مكتبتَي برمجة تطبيقات مشترَكتَين:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libGLESv3.so
libandroid_net.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libneuralnetworks.so
libsync.so
libvndksupport.so
libvulkan.so
-
VNDK-SP
android.hardware.graphics.common@1.0.so
android.hardware.graphics.mapper@2.0.so
android.hardware.renderscript@1.0.so
android.hidl.memory@1.0.so
libRSCpuRef.so
libRSDriver.so
libRS_internal.so
libbase.so
libbcinfo.so
libc++.so
libcutils.so
libhardware.so
libhidlbase.so
libhidlmemory.so
libhidltransport.so
libhwbinder.so
libion.so
libutils.so
libz.so
يمكنك العثور على مزيد من التفاصيل في "/linkerconfig/ld.config.txt
" من الجهاز.
ضبط مجموعة تطوير أصلية للمورّدين (VNDK) Lite
اعتبارًا من Android 8.0، تم ضبط أداة الربط الديناميكي لعزل مكتبتَي SP-HAL و VNDK-SP المشترَكة كي لا تتعارض رموزهما مع مكتبات قاعدة الإطار المشترَكة الأخرى. في ما يلي توضيح للعلاقة بين مساحات أسماء الرابط.
يشير LL-NDK وVNDK-SP إلى المكتبات المشتركة التالية:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libstdc++.so
(غير مضمّنة في الإعداد)libsync.so
libvndksupport.so
libz.so
(تم نقله إلى VNDK-SP في الإعداد)
-
VNDK-SP
android.hardware.graphics.common@1.0.so
android.hardware.graphics.mapper@2.0.so
android.hardware.renderscript@1.0.so
android.hidl.memory@1.0.so
libbase.so
libc++.so
libcutils.so
libhardware.so
libhidlbase.so
libhidlmemory.so
libhidltransport.so
libhwbinder.so
libion.so
libutils.so
يسرد الجدول أدناه إعدادات مساحات الاسم لعمليات الإطار العمل، وهو مقتطف من القسم [system]
في إعدادات VNDK Lite.
مساحة الاسم | الخاصية | القيمة |
---|---|---|
default |
search.paths |
/system/${LIB} /odm/${LIB} /vendor/${LIB} /product/${LIB}
|
isolated |
false |
|
sphal |
search.paths |
/odm/${LIB} /vendor/${LIB}
|
permitted.paths |
/odm/${LIB} /vendor/${LIB}
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk,rs |
|
link.default.shared_libs |
LL-NDK | |
link.vndk.shared_libs |
VNDK-SP | |
link.rs.shared_libs |
libRS_internal.so |
|
vndk (لنظام التشغيل VNDK-SP) |
search.paths |
/odm/${LIB}/vndk-sp /vendor/${LIB}/vndk-sp /system/${LIB}/vndk-sp-${VER}
|
permitted.paths |
/odm/${LIB}/hw /odm/${LIB}/egl /vendor/${LIB}/hw /vendor/${LIB}/egl /system/${LIB}/vndk-sp-${VER}/hw |
|
isolated |
true |
|
visible |
true |
|
links |
default |
|
link.default.shared_libs |
LL-NDK | |
rs (للغة RenderScript) |
search.paths |
/odm/${LIB}/vndk-sp /vendor/${LIB}/vndk-sp /system/${LIB}/vndk-sp-${VER} /odm/${LIB} /vendor/${LIB}
|
permitted.paths |
/odm/${LIB} /vendor/${LIB} /data (لنواة RS المجمّعة)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.so libft2.so
|
|
link.vndk.shared_libs |
خدمة VNDK-SP |
يعرض الجدول أدناه إعدادات مساحات الأسماء لعمليات المورّدين،
والتي تم اقتباسها من قسم [vendor]
في
إعدادات VNDK Lite.
مساحة الاسم | الخاصية | القيمة |
---|---|---|
default |
search.paths |
/odm/${LIB} /odm/${LIB}/vndk /odm/${LIB}/vndk-sp /vendor/${LIB} /vendor/${LIB}/vndk /vendor/${LIB}/vndk-sp /system/${LIB}/vndk-${VER} /system/${LIB}/vndk-sp-${VER} /system/${LIB} (متوقّفة نهائيًا)/product/${LIB} (متوقّفة نهائيًا)
|
isolated |
false |
يمكنك الاطّلاع على مزيد من التفاصيل في /linkerconfig/ld.config.txt
من الجهاز.
سجلّ المستندات
التغييرات على الإصدار 11 من Android
- في نظام التشغيل Android 11، تتم إزالة ملفات
ld.config.*.txt
الثابتة من قاعدة الرموز وينشئها LinkerConfig في وقت التشغيل بدلاً من ذلك.
التغييرات في Android 9
- في Android 9، تتم إضافة مساحة اسم
vndk
لبرنامج الربط إلى عمليات المطوّر، ويتم عزل المكتبات المشتركة لنظام التشغيل VNDK عن مساحة اسم التلقائية لبرنامج الربط. - استبدِل
PRODUCT_FULL_TREBLE
بـPRODUCT_TREBLE_LINKER_NAMESPACES
أكثر تحديدًا. - يغيّر نظام التشغيل Android 9 أسماء ملفات إعدادات الرابط الديناميكي التالية.
الإصدار 8.x من نظام التشغيل Android Android 9 الوصف ld.config.txt.in
ld.config.txt
للأجهزة التي تتضمّن عزل مساحة الاسم الخاصة برابط وقت التشغيل ld.config.txt
ld.config.vndk_lite.txt
للأجهزة التي تتضمّن عزل مساحة الاسم الخاصة برابط VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
للأجهزة القديمة التي تعمل بنظام التشغيل Android 7.x أو الإصدارات الأقدم - أزِل
android.hardware.graphics.allocator@2.0.so
. - تمت إضافة قسمَي
product
وodm
.