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

لینکر پویا دو چالش را در طراحی 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 را به عنوان نام کتابخانه درخواستی می‌پذیرد. لینکر پویا اگر نام کتابخانه درخواستی 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

فهرستی از دایرکتوری‌ها که با دونقطه از هم جدا شده‌اند تا بتوان کتابخانه‌های مشترک را جستجو کرد.

اگر فراخوانی‌های تابع به dlopen() یا ورودی‌های DT_NEEDED مسیر کامل را مشخص نکنند، دایرکتوری‌های مشخص شده در search.paths به نام کتابخانه درخواستی اضافه می‌شوند. دایرکتوری مشخص شده در ابتدای لیست اولویت بالاتری دارد.

وقتی 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 (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() یک شناسه فضای نام لینکر (linker 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-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 برای دستگاه‌هایی که با اندروید ۹ یا بالاتر عرضه شده‌اند، اجباری است
خالی VNDK Lite اجباری برای دستگاه‌هایی که با اندروید ۸.x عرضه شده‌اند
false خالی Legacy برای دستگاه‌های غیر Treble

پیکربندی VNDK Lite کتابخانه‌های اشتراکی SP-HAL و VNDK-SP را ایزوله می‌کند. در اندروید ۸.۰، وقتی PRODUCT_TREBLE_LINKER_NAMESPACES روی true باشد، این فایل پیکربندی باید برای لینکر پویا باشد.

پیکربندی VNDK همچنین کتابخانه‌های اشتراکی SP-HAL و VNDK-SP را ایزوله می‌کند. علاوه بر این، این پیکربندی، ایزوله‌سازی کامل لینکر پویا را فراهم می‌کند. این امر تضمین می‌کند که ماژول‌های موجود در پارتیشن سیستم به کتابخانه‌های اشتراکی موجود در پارتیشن‌های فروشنده وابسته نباشند و برعکس.

در اندروید ۸.۱ یا بالاتر، پیکربندی 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 شرح داده شده است

شکل ۱. جداسازی فضای نام لینکر (پیکربندی 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

از اندروید ۸.۰ به بعد، پیونددهنده‌ی پویا طوری پیکربندی شده است که کتابخانه‌های اشتراکی SP-HAL و VNDK-SP را ایزوله کند تا نمادهای آنها با سایر کتابخانه‌های اشتراکی چارچوب تداخل نداشته باشند. رابطه‌ی بین فضاهای نام پیونددهنده در زیر نشان داده شده است.

گراف فضای نام لینکر که در پیکربندی VNDK Lite شرح داده شده است
شکل ۲. جداسازی فضای نام لینکر (پیکربندی 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 (برای رندراسکریپت) 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 از دستگاه پیدا کنید.

تاریخچه سند

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

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

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

  • در اندروید ۹، فضای نام لینکر vndk به فرآیندهای فروشنده اضافه شده و کتابخانه‌های اشتراکی VNDK از فضای نام لینکر پیش‌فرض جدا شده‌اند.
  • PRODUCT_FULL_TREBLE با عبارت دقیق‌تر PRODUCT_TREBLE_LINKER_NAMESPACES جایگزین کنید.
  • اندروید ۹ نام فایل‌های پیکربندی پیونددهنده پویای زیر را تغییر می‌دهد.
    اندروید ۸.x اندروید ۹ توضیحات
    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 برای دستگاه‌های قدیمی که اندروید ۷.x یا پایین‌تر دارند
  • android.hardware.graphics.allocator@2.0.so را حذف کنید.
  • پارتیشن‌های product و odm اضافه شده‌اند.