يواجه الرابط الديناميكي تحديين في تصميم VNDK في Treble:
- يتم تحميل المكتبات المشتركة لطبقة تجريد الأجهزة (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 |
الإعدادات المحدَّدة | متطلبات VTS |
---|---|---|---|
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 المشتركة. بالإضافة إلى ذلك، يوفّر هذا الإعداد عزل الرابط الديناميكي الكامل. ويضمن ذلك عدم اعتماد الوحدات في قسم النظام على المكتبات المشترَكة في أقسام المورّد والعكس.
في نظام التشغيل Android 8.1 أو الإصدارات الأحدث، يكون إعداد 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
اعتبارًا من الإصدار 8.0 من نظام التشغيل Android، تم إعداد أداة الربط الديناميكي لعزل مكتبات 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
.