يعالج الرابط الديناميكي تحديين في تصميم 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 |
الإعدادات المحدَّدة | متطلبات ميزة VTS |
---|---|---|---|
true |
current |
VNDK |
إلزامي للأجهزة التي تعمل بنظام التشغيل Android 9 أو الإصدارات الأحدث |
فارغ | VNDK Lite |
إلزامي للأجهزة التي تعمل بالإصدار Android 8.x | |
false |
فارغ | Legacy |
للأجهزة التي لا تستخدم الصوت العالي الطبقة |
يعزل إعداد VNDK Lite المكتبات المشتركة SP-HAL وVNDK-SP. في نظام Android 8.0، هذه
يجب أن يكون ملف الإعداد لرابط الديناميكي عند
تم true
ميزة PRODUCT_TREBLE_LINKER_NAMESPACES
.
يعزل إعداد 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
بدءًا من الإصدار 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
- في الإصدار 9 من نظام Android، تتم إضافة مساحة اسم رابط
vndk
إلى المورّد يتم عزل العمليات ومكتبات VNDK المشتركة عن برنامج الربط الافتراضي مساحة الاسم. - استبدال
PRODUCT_FULL_TREBLE
بعبارات أكثر تحديدًاPRODUCT_TREBLE_LINKER_NAMESPACES
- يغيّر نظام التشغيل Android 9 أسماء إعدادات الربط الديناميكي التالية.
الملفات.
الإصدار 8.x من نظام التشغيل Android الإصدار 9 من نظام التشغيل Android الوصف 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
.