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

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

سجلّ المستندات

التغييرات على الإصدار 11 من Android

  • في نظام التشغيل Android 11، تتم إزالة ملفات ld.config.*.txt الثابتة من قاعدة الرموز وينشئها LinkerConfig في وقت التشغيل بدلاً من ذلك.

التغييرات في Android 9

  • في Android 9، تتم إضافة مساحة اسم vndk لبرنامج الربط إلى عمليات المطوّر، ويتم عزل المكتبات المشتركة لنظام التشغيل VNDK عن مساحة اسم التلقائية لبرنامج الربط.
  • استبدِل PRODUCT_FULL_TREBLE بـ PRODUCT_TREBLE_LINKER_NAMESPACES أكثر تحديدًا.
  • يغيّر نظام التشغيل Android 9 أسماء ملفات إعدادات الرابط الديناميكي التالية.
    الإصدار 8.x من نظام التشغيل Android 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.