پیوند دهنده پویا با دو چالش در طراحی 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}
فایل پیکربندی شامل:
- چندین ویژگی نگاشت دایرکتوری-بخش در ابتدا برای پیوند دهنده پویا برای انتخاب بخش مؤثر.
- چندین بخش پیکربندی فضای نام پیوند دهنده:
- هر بخش شامل چندین فضای نام (راس نمودار) و چندین پیوند بازگشتی بین فضاهای نام (قوس های نمودار) است.
- هر فضای نام ایزوله، مسیرهای جستجو، مسیرهای مجاز و تنظیمات دید خود را دارد.
جداول زیر معنای هر ویژگی را به تفصیل شرح می دهد.
ویژگی نگاشت بخش دایرکتوری
اموال | توضیحات | مثال |
---|---|---|
| مسیری به دایرکتوری که بخش هر ویژگی فایل های اجرایی زیر فهرست را به بخش پیکربندی فضاهای نام پیوند دهنده نگاشت می کند. ممکن است دو (یا بیشتر) ویژگی وجود داشته باشد که | این نشان می دهد که پیکربندی مشخص شده در بخش پیکربندی مشخصشده در بخش |
ویژگی های رابطه
اموال | توضیحات | مثال |
---|---|---|
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
اضافه می شوند.