لینکر پویا دو چالش را در طراحی 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}
فایل پیکربندی شامل موارد زیر است:
- چندین ویژگی نگاشت بخش دایرکتوری در ابتدا برای لینکدهنده پویا جهت انتخاب بخش مؤثر.
- چندین بخش پیکربندی فضای نام لینکر:
- هر بخش شامل چندین فضای نام (راسهای گراف) و چندین پیوند جایگزین بین فضاهای نام (کمانهای گراف) است.
- هر فضای نام، تنظیمات ایزولهسازی، مسیرهای جستجو، مسیرهای مجاز و قابلیت مشاهدهی مختص به خود را دارد.
جداول زیر معنای هر ویژگی را به تفصیل شرح میدهند.
ویژگی نگاشت بخش دایرکتوری
| ملک | توضیحات | مثال |
|---|---|---|
| مسیری به دایرکتوری که بخش هر ویژگی، فایلهای اجرایی زیر دایرکتوری را به بخش پیکربندی فضای نامهای پیونددهنده نگاشت میکند. ممکن است دو (یا چند) ویژگی وجود داشته باشند که | این نشان میدهد که پیکربندی مشخصشده در بخش پیکربندی مشخص شده در بخش |
ویژگیهای رابطه
| ملک | توضیحات | مثال |
|---|---|---|
additional. namespaces | فهرستی از فضاهای نام اضافی (علاوه بر فضای نام | این نشان میدهد که سه فضای نام ( |
namespace. name . links | فهرستی از فضاهای نام جایگزین که با کاما از هم جدا شدهاند. اگر یک کتابخانه مشترک در فضای نام فعلی یافت نشود، پیونددهنده پویا سعی میکند کتابخانه مشترک را از فضاهای نام جایگزین بارگذاری کند. فضای نامی که در ابتدای لیست مشخص شده است، اولویت بالاتری دارد. | اگر یک کتابخانه مشترک یا یک فایل اجرایی، کتابخانه مشترکی را درخواست کند که نتواند در فضای نام و سپس، اگر کتابخانه مشترک از فضای نام در نهایت، اگر همه تلاشها با شکست مواجه شوند، لینکر پویا خطایی را برمیگرداند. |
namespace. name . link. other . shared_libs | فهرستی از کتابخانههای مشترک که با دونقطه از هم جدا شدهاند و میتوانند در فضاهای نام این ویژگی را نمیتوان | این نشان میدهد که لینک جایگزین فقط |
namespace. name . link. other . allow_all_shared_libs | یک مقدار بولی که نشان میدهد آیا میتوان تمام کتابخانههای اشتراکی را در فضای نام این ویژگی را نمیتوان | این نشان میدهد که همه نامهای کتابخانه میتوانند از طریق پیوند جایگزین از |
ویژگیهای فضای نام
| ملک | توضیحات | مثال |
|---|---|---|
namespace. name . isolated | یک مقدار بولی که نشان میدهد آیا پیونددهندهی پویا باید محل قرارگیری کتابخانهی مشترک را بررسی کند یا خیر. اگر اگر | این نشان میدهد که فقط کتابخانههای اشتراکی در |
namespace. name . search.paths | فهرستی از دایرکتوریها که با دونقطه از هم جدا شدهاند تا بتوان کتابخانههای مشترک را جستجو کرد. اگر فراخوانیهای تابع به وقتی برای مثال، اگر | این نشان میدهد که پیونددهندهی پویا |
namespace. name . asan.search.paths | فهرستی از دایرکتوریها که با دونقطه از هم جدا شدهاند تا در صورت فعال بودن AddressSanitizer (ASan) به دنبال کتابخانههای مشترک بگردند. | این نشان میدهد که وقتی ASan فعال است، پیونددهنده پویا ابتدا |
namespace. name . permitted.paths | فهرستی از دایرکتوریها (شامل زیردایرکتوریها) که با دونقطه از هم جدا شدهاند و لینکدهندهی پویا میتواند کتابخانههای مشترک (علاوه بر کتابخانههای اشتراکی که در زیرشاخههای اگر | این نشان میدهد که کتابخانههای اشتراکی تحت برای مثال، بدون |
namespace. name . asan.permitted.paths | فهرستی از دایرکتوریها که با دونقطه از هم جدا شدهاند و لینکدهندهی پویا میتواند هنگام فعال بودن ASan، کتابخانههای اشتراکی را در آنها بارگذاری کند. | این نشان میدهد که وقتی ASan فعال باشد، کتابخانههای اشتراکی تحت |
namespace. name . visible | یک مقدار بولی که نشان میدهد آیا برنامه (به غیر از اگر اگر | این نشان میدهد که |
ایجاد فضای نام لینکر
در اندروید ۱۱، پیکربندی لینکر به جای استفاده از فایلهای متنی ساده در ${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).
در تصویر بالا، 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 را ایزوله کند تا نمادهای آنها با سایر کتابخانههای اشتراکی چارچوب تداخل نداشته باشند. رابطهی بین فضاهای نام پیونددهنده در زیر نشان داده شده است.

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-NDKlibmediandk.solibft2.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.inld.config.txtبرای دستگاههایی با جداسازی فضای نام لینکر در زمان اجرا ld.config.txtld.config.vndk_lite.txtبرای دستگاههایی با جداسازی فضای نام لینکر VNDK-SP ld.config.legacy.txtld.config.legacy.txtبرای دستگاههای قدیمی که اندروید ۷.x یا پایینتر دارند -
android.hardware.graphics.allocator@2.0.soرا حذف کنید. - پارتیشنهای
productوodmاضافه شدهاند.