مساحة اسم الرابط

يعالج الرابط الديناميكي تحديين في تصميم 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}

يتضمن ملف التكوين:

  • العديد من خصائص تعيين قسم الدليل في البداية للرابط الديناميكي لتحديد القسم الفعال.
  • عدة أقسام لتكوين مساحات أسماء الروابط:
    • يحتوي كل قسم على عدة مساحات أسماء (رؤوس الرسم البياني) والعديد من الروابط الاحتياطية بين مساحات الأسماء (أقواس الرسم البياني).
    • تحتوي كل مساحة اسم على العزل الخاص بها، ومسارات البحث، والمسارات المسموح بها، وإعدادات الرؤية.

تصف الجداول أدناه معنى كل خاصية بالتفصيل.

خاصية تعيين قسم الدليل

ملكية وصف مثال

dir. name

مسار إلى الدليل الذي ينطبق عليه القسم [ name ] .

تقوم كل خاصية بتعيين الملفات التنفيذية ضمن الدليل إلى قسم تكوين مساحات أسماء الرابط. قد يكون هناك خاصيتين (أو أكثر) لهما نفس name ولكنهما يشيران إلى أدلة مختلفة.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

يشير هذا إلى أن التكوين المحدد في قسم [system] ينطبق على الملفات التنفيذية التي تم تحميلها من /system/bin أو /system/xbin .

ينطبق التكوين المحدد في قسم [vendor] على الملفات التنفيذية التي تم تحميلها من /vendor/bin .

خصائص العلاقة

ملكية وصف مثال
additional. namespaces

قائمة مفصولة بفواصل بمساحات الأسماء الإضافية (بالإضافة إلى مساحة الاسم default ) للقسم.

additional. namespaces = sphal, vndk

يشير هذا إلى وجود ثلاث مساحات أسماء ( default و sphal و vndk ) في تكوين [system] .

namespace. name . links

قائمة مفصولة بفواصل من مساحات الأسماء الاحتياطية.

إذا تعذر العثور على مكتبة مشتركة في مساحة الاسم الحالية، فسيحاول الرابط الديناميكي تحميل المكتبة المشتركة من مساحات الأسماء الاحتياطية. مساحة الاسم المحددة في بداية القائمة لها أولوية أعلى.

namespace. sphal. links = default, vndk

إذا طلبت مكتبة مشتركة أو ملف قابل للتنفيذ مكتبة مشتركة لا يمكن تحميلها في مساحة الاسم sphal ، فإن الرابط الديناميكي يحاول تحميل المكتبة المشتركة من مساحة الاسم default .

وبعد ذلك، إذا تعذر تحميل المكتبة المشتركة من مساحة الاسم default أيضًا، فسيحاول الرابط الديناميكي تحميل المكتبة المشتركة من مساحة الاسم vndk .

وأخيرًا، إذا فشلت كافة المحاولات، فسيقوم الرابط الديناميكي بإرجاع خطأ.

namespace. name . link. other . shared_libs

قائمة مفصولة بنقطتين للمكتبات المشتركة التي يمكن البحث فيها في مساحات الأسماء other عندما لا يمكن العثور على هذه المكتبات في مساحة name .

لا يمكن استخدام هذه الخاصية مع namespace. name . link. other . allow_all_shared_libs .

namespace. sphal. link. default. shared_libs = libc.so: libm.so

يشير هذا إلى أن الارتباط الاحتياطي يقبل فقط libc.so أو libm.so كاسم المكتبة المطلوبة. يتجاهل الرابط الديناميكي الارتباط الاحتياطي من sphal إلى مساحة الاسم default إذا لم يكن اسم المكتبة المطلوبة libc.so أو libm.so .

namespace. name . link. other . allow_all_shared_libs

قيمة منطقية تشير إلى ما إذا كان يمكن البحث في جميع المكتبات المشتركة في مساحة الاسم other عندما لا يمكن العثور على هذه المكتبات في مساحة name .

لا يمكن استخدام هذه الخاصية مع namespace. name . link. other . shared_libs .

namespace. vndk. link. sphal. allow_all_shared_libs = true

يشير هذا إلى أن جميع أسماء المكتبات يمكنها المرور عبر الرابط الاحتياطي من vndk إلى مساحة الاسم sphal .

خصائص مساحة الاسم

ملكية وصف مثال
namespace. name . isolated

قيمة منطقية تشير إلى ما إذا كان يجب على الرابط الديناميكي التحقق من مكان وجود المكتبة المشتركة.

إذا كان isolated true ، فيمكن تحميل فقط المكتبات المشتركة الموجودة في أحد أدلة search.paths (باستثناء الدلائل الفرعية) أو الموجودة ضمن أحد أدلة permitted.paths (بما في ذلك الدلائل الفرعية).

إذا كان isolated false (افتراضي)، فلن يتحقق الرابط الديناميكي من مسار المكتبات المشتركة.

namespace. sphal. isolated = true

يشير هذا إلى أنه يمكن تحميل المكتبات المشتركة في search.paths أو ضمن permitted.paths فقط في مساحة الاسم sphal .

namespace. name . search.paths

قائمة أدلة مفصولة بنقطتين للبحث عن المكتبات المشتركة.

يتم إضافة الدلائل المحددة في search.paths مسبقًا إلى اسم المكتبة المطلوبة إذا كانت استدعاءات الوظيفة إلى dlopen() أو إدخالات DT_NEEDED لا تحدد المسار الكامل. الدليل المحدد في بداية القائمة له أولوية أعلى.

عندما يكون isolated true ، يمكن تحميل المكتبات المشتركة الموجودة في أحد أدلة search.paths (باستثناء الدلائل الفرعية) بغض النظر عن الخاصية permitted.paths .

على سبيل المثال، إذا كانت search.paths هي /system/${LIB} وكانت permitted.paths فارغة، فيمكن تحميل /system/${LIB}/libc.so ولكن /system/${LIB}/vndk/libutils.so لا يمكن تحميلها.

namespace. default. search.paths = /system/${LIB}

يشير هذا إلى أن الرابط الديناميكي يبحث في /system/${LIB} عن المكتبات المشتركة.

namespace. name . asan.search.paths

قائمة أدلة مفصولة بنقطتين للبحث عن المكتبات المشتركة عند تمكين AddressSanitizer (ASan) .

namespace. name . search.paths يتم تجاهل namespace. name . search.paths عند تمكين Asan .

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

يشير هذا إلى أنه عند تمكين Asan ، يبحث الرابط الديناميكي عن /data/asan/system/${LIB} أولاً ثم يبحث عن /system/${LIB} .

namespace. name . permitted.paths

قائمة من الدلائل مفصولة بنقطتين (بما في ذلك الدلائل الفرعية) حيث يمكن للرابط الديناميكي تحميل المكتبات المشتركة (بالإضافة إلى search.paths ) عندما يكون isolated true .

يمكن أيضًا تحميل المكتبات المشتركة الموجودة ضمن الدلائل الفرعية permitted.paths بها. على سبيل المثال، إذا كان permitted.paths هو /system/${LIB} ، فيمكن تحميل كل من /system/${LIB}/libc.so و /system/${LIB}/vndk/libutils.so .

إذا كانت isolated false ، فسيتم تجاهل permitted.paths المسموح بها ويتم إصدار تحذير.

namespace. default. permitted.paths = /system/${LIB}/hw

يشير هذا إلى أنه يمكن تحميل المكتبات المشتركة ضمن /system/${LIB}/hw في مساحة الاسم default المعزولة.

على سبيل المثال، بدون permitted.paths ، لا يمكن لـ libaudiohal.so تحميل /system/${LIB}/hw/audio.a2dp.default.so في مساحة الاسم default .

namespace. name . asan.permitted.paths

قائمة من الدلائل مفصولة بنقطتين حيث يمكن للرابط الديناميكي تحميل المكتبات المشتركة عند تمكين Asan .

namespace. name . permitted.paths يتم تجاهل المسموح به namespace. name . permitted.paths عند تمكين Asan .

namespace. default. asan.permitted.paths = /data/asan/system/${LIB}/hw: /system/${LIB}/hw

يشير هذا إلى أنه عند تمكين Asan ، يمكن تحميل المكتبات المشتركة ضمن /data/asan/system/${LIB}/hw أو /system/${LIB}/hw إلى مساحة الاسم default المعزولة.

namespace. name . visible

قيمة منطقية تشير إلى ما إذا كان البرنامج (بخلاف libc ) يمكنه الحصول على مقبض مساحة اسم الرابط باستخدام android_get_exported_namespace() وفتح مكتبة مشتركة في مساحة اسم الرابط عن طريق تمرير المقبض إلى android_dlopen_ext() .

إذا كان visible true ، فسيقوم android_get_exported_namespace() دائمًا بإرجاع المقبض إذا كانت مساحة الاسم موجودة.

إذا كانت visible هي false (افتراضي)، فسيُرجع android_get_exported_namespace() دائمًا NULL بغض النظر عن وجود مساحة الاسم. لا يمكن تحميل المكتبات المشتركة في مساحة الاسم هذه إلا إذا (1) تم طلبها بواسطة مساحة اسم رابط أخرى تحتوي على رابط احتياطي لمساحة الاسم هذه، أو (2) تم طلبها بواسطة مكتبات مشتركة أخرى أو ملفات قابلة للتنفيذ في مساحة الاسم هذه.

namespace. sphal. visible = true

يشير هذا إلى أن android_get_exported_namespace("sphal") يمكنه إرجاع مقبض مساحة اسم رابط صالح.

إنشاء مساحة اسم الرابط

في 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 .

يتم توضيح العلاقة بين مساحات أسماء الرابط أدناه.

الرسم البياني لمساحة اسم الرابط الموضح في تكوين VNDK
الشكل 1. عزل مساحة اسم الرابط (تكوين VNDK)

في الصورة أعلاه، يرمز 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 بحيث لا تتعارض رموزها مع مكتبات إطار العمل المشتركة الأخرى. العلاقة بين مساحات أسماء الرابط موضحة أدناه.

الرسم البياني لمساحة اسم الرابط الموضح في تكوين VNDK Lite
الشكل 2. عزل مساحة اسم الرابط (تكوين VNDK Lite)

يرمز 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 .