يعالج الرابط الديناميكي تحديين في تصميم 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. namespaces | قائمة مفصولة بفواصل بمساحات الأسماء الإضافية (بالإضافة إلى مساحة الاسم | يشير هذا إلى وجود ثلاث مساحات أسماء ( |
namespace. name . links | قائمة مفصولة بفواصل من مساحات الأسماء الاحتياطية. إذا تعذر العثور على مكتبة مشتركة في مساحة الاسم الحالية، فسيحاول الرابط الديناميكي تحميل المكتبة المشتركة من مساحات الأسماء الاحتياطية. مساحة الاسم المحددة في بداية القائمة لها أولوية أعلى. | إذا طلبت مكتبة مشتركة أو ملف قابل للتنفيذ مكتبة مشتركة لا يمكن تحميلها في مساحة الاسم وبعد ذلك، إذا تعذر تحميل المكتبة المشتركة من مساحة الاسم وأخيرًا، إذا فشلت كافة المحاولات، فسيقوم الرابط الديناميكي بإرجاع خطأ. |
namespace. name . link. other . shared_libs | قائمة مفصولة بنقطتين للمكتبات المشتركة التي يمكن البحث فيها في مساحات الأسماء لا يمكن استخدام هذه الخاصية مع | يشير هذا إلى أن الارتباط الاحتياطي يقبل فقط |
namespace. name . link. other . allow_all_shared_libs | قيمة منطقية تشير إلى ما إذا كان يمكن البحث في جميع المكتبات المشتركة في مساحة الاسم لا يمكن استخدام هذه الخاصية مع | يشير هذا إلى أن جميع أسماء المكتبات يمكنها المرور عبر الرابط الاحتياطي من |
خصائص مساحة الاسم
ملكية | وصف | مثال |
---|---|---|
namespace. name . isolated | قيمة منطقية تشير إلى ما إذا كان يجب على الرابط الديناميكي التحقق من مكان وجود المكتبة المشتركة. إذا كان إذا كان | يشير هذا إلى أنه يمكن تحميل المكتبات المشتركة في |
namespace. name . search.paths | قائمة أدلة مفصولة بنقطتين للبحث عن المكتبات المشتركة. يتم إضافة الدلائل المحددة في عندما يكون على سبيل المثال، إذا كانت | يشير هذا إلى أن الرابط الديناميكي يبحث في |
namespace. name . asan.search.paths | قائمة أدلة مفصولة بنقطتين للبحث عن المكتبات المشتركة عند تمكين AddressSanitizer (ASan) . | يشير هذا إلى أنه عند تمكين Asan ، يبحث الرابط الديناميكي عن |
namespace. name . permitted.paths | قائمة من الدلائل مفصولة بنقطتين (بما في ذلك الدلائل الفرعية) حيث يمكن للرابط الديناميكي تحميل المكتبات المشتركة (بالإضافة إلى يمكن أيضًا تحميل المكتبات المشتركة الموجودة ضمن الدلائل الفرعية إذا كانت | يشير هذا إلى أنه يمكن تحميل المكتبات المشتركة ضمن على سبيل المثال، بدون |
namespace. name . asan.permitted.paths | قائمة من الدلائل مفصولة بنقطتين حيث يمكن للرابط الديناميكي تحميل المكتبات المشتركة عند تمكين Asan . | يشير هذا إلى أنه عند تمكين Asan ، يمكن تحميل المكتبات المشتركة ضمن |
namespace. name . visible | قيمة منطقية تشير إلى ما إذا كان البرنامج (بخلاف إذا كان إذا كانت | يشير هذا إلى أن |
إنشاء مساحة اسم الرابط
في 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 | إلزامي للأجهزة التي تعمل بنظام التشغيل Android 9 أو أعلى |
فارغ | VNDK Lite | إلزامي للأجهزة التي تم إطلاقها باستخدام Android 8.x | |
false | فارغ | Legacy | للأجهزة غير الثلاثية |
يعمل تكوين 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-HALs في مساحة الاسم
sphal
. - تم تحميل مكتبات VNDK-SP المشتركة في مساحة الاسم
vndk
.
- يتم إنشاء مساحات الأسماء
عمليات البائع
- يتم إنشاء مساحات الأسماء
default
وvndk
system
. - مساحة الاسم
default
معزولة. - يتم تحميل المكتبات المشتركة للموردين في مساحة الاسم
default
. - يتم تحميل مكتبات VNDK وVNDK-SP المشتركة في مساحة الاسم
vndk
. - يتم تحميل LL-NDK وتبعياته في مساحة اسم
system
.
- يتم إنشاء مساحات الأسماء
يتم توضيح العلاقة بين مساحات أسماء الرابط أدناه.
في الصورة أعلاه، يرمز LL-NDK و VNDK-SP إلى المكتبات المشتركة التالية:
- إل إل إن دي كيه
-
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
-
- فندك-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 لايت
اعتبارًا من Android 8.0، تم تكوين الرابط الديناميكي لعزل المكتبات المشتركة SP-HAL وVNDK-SP بحيث لا تتعارض رموزها مع مكتبات إطار العمل المشتركة الأخرى. العلاقة بين مساحات أسماء الرابط موضحة أدناه.
يرمز LL-NDK و VNDK-SP إلى المكتبات المشتركة التالية:
- إل إل إن دي كيه
-
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 في التكوين)
-
- فندك-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 | إل إل إن دي كيه | |
link.vndk.shared_libs | فندك-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 | إل إل إن دي كيه | |
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 | إل إل إن دي كيهlibmediandk.so libft2.so | |
link.vndk.shared_libs | فندك-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 11، تتم إزالة ملفات
ld.config.*.txt
الثابتة من قاعدة التعليمات البرمجية ويقوم LinkerConfig بإنشائها في وقت التشغيل بدلاً من ذلك.
تغييرات اندرويد 9
- في Android 9، تتم إضافة مساحة اسم رابط
vndk
إلى عمليات البائع ويتم عزل مكتبات VNDK المشتركة عن مساحة اسم الرابط الافتراضية. - استبدل
PRODUCT_FULL_TREBLE
بـPRODUCT_TREBLE_LINKER_NAMESPACES
أكثر تحديدًا. - يقوم Android 9 بتغيير أسماء ملفات تكوين الرابط الديناميكي التالية.
أندرويد 8.x أندرويد 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
.