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

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

في الإصدار 8.1 من نظام التشغيل Android أو الإصدارات الأحدث، يكون إعداد 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

اعتبارًا من Android 8.0، تم ضبط أداة الربط الديناميكي لعزل مكتبتَي 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.