فضای نام پیوند دهنده

پیوند دهنده پویا با دو چالش در طراحی 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]/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 را به عنوان نام کتابخانه درخواستی می پذیرد. اگر نام کتابخانه درخواستی libc.so یا libm.so نباشد، پیوند دهنده پویا پیوند بازگشتی از sphal به فضای نام default را نادیده می‌گیرد.

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. name . search.paths نادیده گرفته می شود.

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

این نشان می‌دهد که وقتی ASan فعال است، پیوند دهنده پویا ابتدا /data/asan/system/${LIB} جستجو می‌کند و سپس /system/${LIB} را جستجو می‌کند.

namespace. name . permitted.paths

فهرستی از دایرکتوری‌ها (شامل زیرشاخه‌ها) جدا شده با کولون که در آن پیوندگر پویا می‌تواند کتابخانه‌های اشتراک‌گذاری شده (علاوه بر search.paths ) را در true isolated بارگیری کند.

کتابخانه های مشترکی که در زیر شاخه های 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، به جای استفاده از فایل‌های متنی ساده در ${android-src}/system/core/rootdir/etc پیکربندی پیوند دهنده در زمان اجرا تحت /linkerconfig ایجاد می‌شود. پیکربندی در زمان بوت بر اساس محیط زمان اجرا ایجاد می شود که شامل موارد زیر است:

  • اگر دستگاه از 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-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

  • در اندروید 11، فایل‌های ثابت ld.config.*.txt از پایگاه کد حذف می‌شوند و LinkerConfig آنها را در زمان اجرا تولید می‌کند.

تغییرات اندروید 9

  • در اندروید 9، فضای نام پیوند دهنده vndk به فرآیندهای فروشنده اضافه می‌شود و کتابخانه‌های اشتراک‌گذاری شده VNDK از فضای نام پیوند دهنده پیش‌فرض جدا می‌شوند.
  • PRODUCT_FULL_TREBLE با PRODUCT_TREBLE_LINKER_NAMESPACES خاص تر جایگزین کنید.
  • اندروید 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 اضافه می شوند.