يواجه أداة الربط الديناميكية تحديَين في تصميم 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
من الجهاز.
سجلّ المستندات
التغييرات في Android 11
- في Android 11، تتم
إزالة ملفات
ld.config.*.txt
الثابتة من قاعدة البيانات، وتنشئ أداة LinkerConfig هذه الملفات أثناء التشغيل بدلاً من ذلك.
التغييرات في Android 9
- في Android 9، تتم إضافة مساحة اسم
vndk
لبرنامج الربط إلى عمليات المطوّر، ويتم عزل المكتبات المشتركة لنظام التشغيل VNDK عن مساحة اسم التلقائية لبرنامج الربط. - استبدِل
PRODUCT_FULL_TREBLE
بعبارة أكثر تحديدًاPRODUCT_TREBLE_LINKER_NAMESPACES
. - يغيّر نظام التشغيل Android 9 أسماء ملفات إعدادات الرابط الديناميكي التالية.
Android 8.x 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
.