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

شکل 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 را جدا کند تا نمادهای آنها با سایر کتابخانههای مشترک چارچوب تضاد نداشته باشند. رابطه بین فضاهای نام پیوند دهنده در زیر نشان داده شده است.

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-NDKlibmediandk.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
اضافه می شوند.
پیوند دهنده پویا با دو چالش در طراحی 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 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
بارگذاری می شوند.
- فضای نام
رابطه بین فضاهای نام پیوند دهنده در زیر نشان داده شده است.

شکل 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 را جدا کند تا نمادهای آنها با سایر کتابخانههای مشترک چارچوب تضاد نداشته باشند. رابطه بین فضاهای نام پیوند دهنده در زیر نشان داده شده است.

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-NDKlibmediandk.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
اضافه می شوند.
پیوند دهنده پویا با دو چالش در طراحی Treble VNDK مقابله می کند:
- کتابخانه های مشترک SP-HAL و وابستگی های آنها، از جمله کتابخانه های VNDK-SP، در فرآیندهای چارچوب بارگذاری می شوند. باید مکانیسم هایی برای جلوگیری از تضاد نمادها وجود داشته باشد.
-
dlopen()
وandroid_dlopen_ext()
میتوانند برخی وابستگیهای زمان اجرا را معرفی کنند که در زمان ساخت قابل مشاهده نیستند و تشخیص آنها با استفاده از تجزیه و تحلیل استاتیک دشوار است.
این دو چالش را می توان با مکانیزم فضای نام پیوند دهنده حل کرد. این مکانیسم توسط پیوند دهنده پویا ارائه می شود. میتواند کتابخانههای اشتراکگذاری شده را در فضاهای نام پیوندی مختلف جدا کند تا کتابخانههایی با نام کتابخانه یکسان اما با نمادهای متفاوت تداخل نداشته باشند.
از سوی دیگر، مکانیسم فضای نام پیوند دهنده انعطاف پذیری را فراهم می کند به طوری که برخی از کتابخانه های مشترک می توانند توسط یک فضای نام پیوند دهنده صادر شده و توسط فضای نام پیوند دهنده دیگر استفاده شوند. این کتابخانه های مشترک صادر شده می توانند به واسطه های برنامه نویسی برنامه تبدیل شوند که ضمن پنهان کردن جزئیات اجرای خود در فضای نام Linker خود ، به سایر برنامه ها عمومی هستند.
به عنوان مثال ، /system/lib[64]/libcutils.so
libociation64 levent/libcutils.so و /system/lib[64]/vndk-sp-${VER}/libcutils.so
/libociation64 leven/vndk-sp- $ {ver }/libcutils.so دو کتابخانه مشترک هستند. این دو کتابخانه می توانند نمادهای مختلفی داشته باشند. آنها در مناطق مختلف پیوند دهنده بارگذاری شده اند تا ماژول های چارچوب بتوانند به /system/lib[64]/libcutils.so
libociation64 leven /system/lib[64]/vndk-sp-${VER}/libcutils.so
libcutils.so و sp-hal کتابخانه های مشترک وابسته باشند.
از طرف دیگر ، /system/lib[64]/libc.so
libociation64 ely/libc.so نمونه ای از یک کتابخانه عمومی است که توسط یک فضای نام لینک دهنده صادر می شود و به بسیاری از مناطق نامزد کننده وارد می شود. وابستگی های /system/lib[64]/libc.so
libociation64 levent/libc.so ، مانند libnetd_client.so
، در فضای نام قرار می گیرد که در آن /system/lib[64]/libc.so
libociation64 levent/libc.so ساکن است. سایر مکانهای نام دسترسی به آن وابستگی ها ندارند. این مکانیسم ضمن ارائه رابط های عمومی ، جزئیات اجرای را در بر می گیرد.
چگونه کار می کند
پیوند دهنده پویا وظیفه بارگذاری کتابخانه های مشترک مشخص شده در ورودی های DT_NEEDED
یا کتابخانه های مشترک مشخص شده توسط آرگومان dlopen()
یا android_dlopen_ext()
بر عهده دارد. در هر دو مورد ، پیوند دهنده پویا فضای نام پیوند دهنده را پیدا می کند که تماس گیرنده در آن زندگی می کند و سعی می کند وابستگی ها را در همان فضای پیوند دهنده بارگذاری کند. اگر پیوند دهنده پویا نتواند کتابخانه مشترک را در فضای نام Linker مشخص شده بارگذاری کند ، از فضای نام پیوند دهنده پیوند یافته برای کتابخانه های مشترک صادر شده درخواست می کند.
قالب پرونده پیکربندی
فرمت فایل پیکربندی بر اساس فرمت فایل 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}
پرونده پیکربندی شامل:
- چندین ویژگی نقشه برداری از بخش دایرکتوری در ابتدا برای پیوند دهنده پویا برای انتخاب بخش مؤثر.
- چندین بخش پیکربندی فضای نام لینک دهنده:
- هر بخش شامل چندین نام نام (راس نمودار) و چندین پیوند برگشتی بین مکان های نام (قوس گراف) است.
- هر فضای نام از انزوا ، مسیرهای جستجو ، مسیرهای مجاز و تنظیمات دید خود برخوردار است.
جداول زیر معنای هر خاصیت را با جزئیات شرح می دهد.
املاک نقشه برداری بخش دایرکتوری
اموال | توضیحات | مثال |
---|---|---|
| مسیری به دایرکتوری که بخش هر خاصیت اجرایی را در زیر دایرکتوری به بخش پیکربندی نام های نام Linker نقشه می کند. ممکن است دو (یا بیشتر) ویژگی وجود داشته باشد که دارای یک | این نشان می دهد که پیکربندی مشخص شده در بخش پیکربندی مشخص شده در بخش |
خصوصیات رابطه
اموال | توضیحات | مثال |
---|---|---|
additional. namespaces | یک لیست جدا از کاما از مناطق نام اضافی (علاوه بر فضای نام | این نشان می دهد که در پیکربندی |
namespace. name . links | یک لیست از هم جدا از کاما از مناطق نامشخص. اگر یک کتابخانه مشترک در فضای نام فعلی پیدا نشود ، پیوند دهنده پویا سعی می کند کتابخانه مشترک را از مناطق نامشخص بارگیری کند. فضای نام مشخص شده در ابتدای لیست اولویت بالاتری دارد. | اگر یک کتابخانه مشترک یا یک اجرایی از یک کتابخانه مشترک درخواست کند که نمی تواند در فضای نام و پس از آن ، اگر کتابخانه مشترک از فضای نام سرانجام ، در صورت عدم موفقیت همه تلاش ها ، پیوند دهنده پویا خطایی را برمی گرداند. |
namespace. name . link. other . shared_libs | یک لیست جدا از روده بزرگ از کتابخانه های مشترک که می توانند در سایت های این خاصیت را نمی توان با | این نشان می دهد که پیوند Fallback فقط به عنوان نام کتابخانه درخواست شده فقط |
namespace. name . link. other . allow_all_shared_libs | یک مقدار بولی که نشان می دهد آیا همه کتابخانه های مشترک را می توان در فضای نام این خاصیت را نمی توان با | این نشان می دهد که تمام نام های کتابخانه می توانند از طریق پیوند Fallback از |
خصوصیات فضای نام
اموال | توضیحات | مثال |
---|---|---|
namespace. name . isolated | یک مقدار بولی که نشان می دهد آیا پیوند دهنده پویا باید بررسی کند که کتابخانه مشترک در کجا ساکن است. اگر اگر | این نشان می دهد که فقط کتابخانه های مشترک در |
namespace. name . search.paths | لیستی از دایرکتوری های جدا از روده بزرگ برای جستجوی کتابخانه های مشترک. دایرکتوری های مشخص شده در هنگامی که به عنوان مثال ، اگر | این نشان می دهد که جستجوگر پیوند دهنده پویا |
namespace. name . asan.search.paths | لیستی از دایرکتوری های جدا از روده بزرگ برای جستجوی کتابخانه های مشترک در هنگام فعال کردن آدرس دهنده (ASAN) . | این نشان می دهد که هنگامی که ASAN به دنبال جستجوگر پیوند دهنده پویا |
namespace. name . permitted.paths | لیستی از دایرکتوری های جدا شده از روده بزرگ (از جمله زیر مجموعه ها) که در آن پیوند دهنده پویا می تواند کتابخانه های مشترک (علاوه بر کتابخانه های مشترک که تحت زیر مجموعه های اگر | این نشان می دهد که کتابخانه های مشترک تحت به عنوان مثال ، بدون |
namespace. name . asan.permitted.paths | لیستی از دایرکتوری های جدا از روده بزرگ که در آن پیوند دهنده پویا می تواند کتابخانه های مشترک را هنگام فعال کردن ASAN بارگیری کند. | این نشان می دهد که وقتی ASAN کتابخانه های مشترک تحت |
namespace. name . visible | یک مقدار بولی که نشان می دهد آیا این برنامه (غیر از اگر اگر | این نشان می دهد که |
ایجاد فضای نام پیوند دهنده
در Android 11 ، پیکربندی پیوند دهنده به جای استفاده از فایلهای متنی ساده در ${android-src}/system/core/rootdir/etc
در زمان اجرا در زیر /linkerconfig
ایجاد می شود. پیکربندی در زمان بوت بر اساس محیط زمان اجرا ایجاد می شود ، که شامل موارد زیر است:
- اگر دستگاه از VNDK پشتیبانی می کند
- نسخه VNDK هدف پارتیشن فروشنده
- نسخه VNDK پارتیشن محصول
- ماژول های Apex نصب شده
پیکربندی Linker با حل وابستگی بین مکانهای نام Linker ایجاد می شود. به عنوان مثال ، اگر به روزرسانی هایی در ماژول های 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. در Android 8.0 ، این باید فایل پیکربندی برای پیوند پویا باشد که PRODUCT_TREBLE_LINKER_NAMESPACES
true
است.
پیکربندی VNDK همچنین کتابخانه های مشترک SP-HAL و VNDK را جدا می کند. علاوه بر این ، این پیکربندی انزوای پیوند دهنده پویا کامل را فراهم می کند. این تضمین می کند که ماژول های موجود در پارتیشن سیستم به کتابخانه های مشترک در پارتیشن های فروشنده و برعکس بستگی ندارند.
در Android 8.1 یا بالاتر ، پیکربندی VNDK پیکربندی پیش فرض است و بسیار توصیه می شود که با تنظیم BOARD_VNDK_VERSION
به current
، جداسازی پیوند دهنده پویا کامل را فعال کنید.
پیکربندی VNDK
پیکربندی VNDK وابستگی های مشترک کتابخانه بین پارتیشن سیستم و پارتیشن های فروشنده را جدا می کند. در مقایسه با تنظیمات ذکر شده در زیر بخش قبلی ، تفاوت ها به شرح زیر بیان شده است:
فرآیندهای چارچوب
- نام های
default
،vndk
،sphal
وrs
ایجاد می شوند. - همه فضای نام منزوی هستند.
- کتابخانه های مشترک سیستم در فضای نام
default
بارگذاری می شوند. - HALS SP در فضای نام
sphal
بارگذاری می شود. - کتابخانه های مشترک VNDK-SP که در فضای نام
vndk
بارگذاری شده اند.
- نام های
فرآیندهای فروشنده
-
default
،vndk
و نام های نامsystem
ایجاد می شوند. - فضای نام
default
منزوی است. - کتابخانه های مشترک فروشنده در فضای نام
default
بارگیری می شوند. - کتابخانه های مشترک VNDK و VNDK-SP در فضای نام
vndk
بارگیری می شوند. - LL-NDK و وابستگی های آن در فضای نام
system
بارگذاری می شوند.
-
رابطه بین فضای نام پیوند دهنده در زیر نشان داده شده است.

شکل 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 تنظیم شده است به گونه ای که نمادهای آنها با سایر کتابخانه های مشترک چارچوب مغایرت ندارند. رابطه بین سایتهای پیوند دهنده در زیر نشان داده شده است.

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-NDKlibmediandk.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 ، static
ld.config.*.txt
از پایگاه کد حذف می شوند و LinkerConfig به جای آن ، آنها را در زمان اجرا تولید می کند.
Android 9 تغییر می کند
- در Android 9 ، فضای نام Linker
vndk
به فرآیندهای فروشنده اضافه می شود و کتابخانه های مشترک VNDK از فضای نام پیش فرض پیوند دهنده جدا می شوند. -
PRODUCT_FULL_TREBLE
باPRODUCT_TREBLE_LINKER_NAMESPACES
جایگزین کنید. - Android 9 نام پرونده های پیکربندی پیوند دهنده پویا زیر را تغییر می دهد.
Android 8.x اندروید 9 توضیحات ld.config.txt.in
ld.config.txt
برای دستگاه هایی با انزوا فضای نانوانده نامزد ld.config.txt
ld.config.vndk_lite.txt
برای دستگاه هایی با Isolation Linker Linker VNDK-SP ld.config.legacy.txt
ld.config.legacy.txt
برای دستگاه های میراث که Android 7.x یا پایین را اجرا می کنند -
android.hardware.graphics.allocator@2.0.so
را حذف کنید. - پارتیشن های
product
وodm
اضافه می شوند.