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

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

يتضمّن ملف الإعداد ما يلي:

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

توضّح الجداول أدناه معنى كل سمة بالتفصيل.

موقع ربط أقسام الدليل

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

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 عند تفعيل 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 إلى مساحة الاسم default./system/${LIB}/hw/audio.a2dp.default.so

namespace.name.asan.permitted.paths

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

يتم تجاهل 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 إلزامي للأجهزة التي تم إطلاقها بالإصدار 9 من نظام التشغيل Android أو الإصدارات الأحدث
فارغة VNDK Lite إلزامي للأجهزة التي تم طرحها باستخدام الإصدار 8.x من نظام التشغيل Android
false فارغة Legacy بالنسبة إلى الأجهزة غير المتوافقة مع Treble

يؤدي إعداد VNDK Lite إلى عزل مكتبات SP-HAL وVNDK-SP المشتركة. في الإصدار 8.0 من نظام التشغيل Android، يجب أن يكون هذا هو ملف الإعداد الخاص بالرابط الديناميكي عندما تكون قيمة 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.

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

الرسم البياني لمساحة اسم أداة الربط الموضّح في إعدادات VNDK

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

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

يشير 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-NDK
libmediandk.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.