پیونددهنده پویا دو چالش را در طراحی 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. |
فهرست جداشده با کاما از فضاهای نام اضافی (علاوهبر فضای نام
|
این نشان میدهد که سه فضانام ( |
namespace. |
فهرست جداشده با کاما از فضاهای نام جایگزین. اگر کتابخانه مشترکی در فضای نام کنونی پیدا نشود، پیونددهنده پویا سعی میکند کتابخانه مشترک را از فضاهای نام بازگشت بار کند. فضای نامی که در ابتدای فهرست مشخص شده است اولویت بالاتری دارد. |
اگر کتابخانه مشترک یا فایل اجرایی کتابخانه مشترکی را درخواست کند که
نتواند در فضای نام و سپس، اگر کتابخانه مشترک نتواند از فضای نام درنهایت، اگر همه تلاشها ناموفق باشد، پیونددهنده پویا خطایی را برمیگرداند. |
namespace. |
فهرستی از کتابخانههای مشترک که با دونقطه از هم جدا شدهاند و میتوانند در
نمیتوان از این دارایی با
|
این نشان میدهد که پیوند بازگشت فقط |
namespace. |
مقدار بولی که نشان میدهد آیا همه کتابخانههای مشترک میتوانند
در فضای نام نمیتوان از این دارایی با
|
این نشان میدهد که همه نامهای کتابخانه میتوانند ازطریق پیوند بازگشت
از فضای نام |
خصوصیتهای فضای نام
| دارایی | شرح | مثال |
|---|---|---|
namespace. |
مقدار بولی که نشان میدهد آیا پیونددهنده پویا باید بررسی کند کتابخانه مشترک کجا قرار دارد یا نه. اگر اگر |
این نشان میدهد که فقط کتابخانههای مشترک در
|
namespace. |
فهرست جداشده با دونقطه از دایرکتوریهایی که باید برای کتابخانههای مشترک جستجو شوند. اگر فراخوانیهای تابع در وقتی برای مثال، اگر |
این نشان میدهد که پیونددهنده پویا
|
namespace. |
فهرستی از دایرکتوریها که با دونقطه از هم جدا شدهاند تا هنگام فعال بودن AddressSanitizer (ASan)، کتابخانههای مشترک در آنها جستجو شود. وقتی ASan فعال باشد، |
این نشان میدهد که وقتی
ASan فعال است،
پیونددهنده پویا ابتدا |
namespace. |
فهرستی از دایرکتوریها (شامل زیردایرکتوریها) که با دونقطه از هم جدا شدهاند و در آنها
پیونددهنده پویا میتواند کتابخانههای همرسانیشده را (علاوهبر
کتابخانههای مشترکی که در زیرفهرستهای راهنمای
اگر |
این نشان میدهد که کتابخانههای مشترک در
برای مثال، بدون |
namespace. |
فهرست دایرکتوریهای جداشده با دونقطه که پیونددهنده پویا میتواند کتابخانههای مشترک را درصورت فعال بودن ASan بار کند.
|
این نشان میدهد که وقتی ASan فعال باشد،
کتابخانههای مشترک تحت |
namespace. |
مقدار بولی که نشان میدهد آیا برنامه (بهغیراز
اگر اگر |
این نشان میدهد که |
ایجاد فضای نام پیونددهنده
در Android 11، پیکربندی پیونددهنده در زمان اجرا در
/linkerconfig بهجای استفاده از فایلهای نوشتار ساده در
${android-src}/system/core/rootdir/etc ایجاد میشود. پیکربندی در زمان راهاندازی براساس محیط زمان اجرا تولید میشود که شامل موارد زیر است:
- اگر دستگاه از 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 |
برای دستگاههای غیرTreble |
پیکربندی VNDK Lite کتابخانههای مشترک SP-HAL و VNDK-SP را جدا میکند. در Android 8.0، این باید فایل پیکربندی پیونددهنده پویا وقتی PRODUCT_TREBLE_LINKER_NAMESPACES برابر با true باشد.
پیکربندی VNDK همچنین کتابخانههای مشترک SP-HAL و VNDK-SP را جدا میکند. علاوهبراین، این پیکربندی جداسازی کامل پیونددهنده پویا را فراهم میکند. این کار تضمین میکند که ماژولهای موجود در پارتیشن سیستم به کتابخانههای مشترک در پارتیشنهای فروشنده وابسته نباشند و بالعکس.
در Android نسخه ۸.۱ یا بالاتر، پیکربندی 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.solibGLESv1_CM.solibGLESv2.solibGLESv3.solibandroid_net.solibc.solibdl.soliblog.solibm.solibnativewindow.solibneuralnetworks.solibsync.solibvndksupport.solibvulkan.so
-
VNDK-SP
android.hardware.graphics.common@1.0.soandroid.hardware.graphics.mapper@2.0.soandroid.hardware.renderscript@1.0.soandroid.hidl.memory@1.0.solibRSCpuRef.solibRSDriver.solibRS_internal.solibbase.solibbcinfo.solibc++.solibcutils.solibhardware.solibhidlbase.solibhidlmemory.solibhidltransport.solibhwbinder.solibion.solibutils.solibz.so
جزئیات بیشتر را میتوانید در /linkerconfig/ld.config.txt دستگاه ببینید.
پیکربندی VNDK Lite
از Android 8.0، پیونددهنده پویا بهگونهای پیکربندی شده است که کتابخانههای مشترک SP-HAL و VNDK-SP را جدا کند تا نشانههای آنها با دیگر کتابخانههای مشترک چارچوب تداخل نداشته باشد. رابطه بین فضاهای نام پیونددهنده در زیر نشان داده شده است.
LL-NDK و VNDK-SP مخفف کتابخانههای مشترک زیر هستند:
-
LL-NDK
libEGL.solibGLESv1_CM.solibGLESv2.solibc.solibdl.soliblog.solibm.solibnativewindow.so-
libstdc++.so(در پیکربندی نیست) libsync.solibvndksupport.so-
libz.so(به VNDK-SP در پیکربندی منتقل شد)
-
VNDK-SP
android.hardware.graphics.common@1.0.soandroid.hardware.graphics.mapper@2.0.soandroid.hardware.renderscript@1.0.soandroid.hidl.memory@1.0.solibbase.solibc++.solibcutils.solibhardware.solibhidlbase.solibhidlmemory.solibhidltransport.solibhwbinder.solibion.solibutils.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.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 از دستگاه پیدا کنید.
سابقه سند
تغییرات Android 11
- در Android 11، فایلهای
ld.config.*.txtایستا از پایگاه کد برداشته شده است و بهجای آن، LinkerConfig آنها را در زمان اجرا تولید میکند.
Android 9 تغییر میکند
- در Android 9، فضای نام پیونددهنده
vndkبه فرایندهای فروشنده اضافه میشود و کتابخانههای مشترک VNDK از فضای نام پیونددهنده پیشفرض جدا میشوند. PRODUCT_FULL_TREBLEرا باPRODUCT_TREBLE_LINKER_NAMESPACESخاصتری جایگزین کنید.- Android 9 نام فایلهای پیکربندی پیونددهنده پویا زیر را تغییر میدهد.
Android 8.x Android 9 شرح ld.config.txt.inld.config.txtبرای دستگاههای دارای جداسازی جاینام پیونددهنده زمان اجرا ld.config.txtld.config.vndk_lite.txtبرای دستگاههای دارای جداسازی فضای نام پیونددهنده VNDK-SP ld.config.legacy.txtld.config.legacy.txtبرای دستگاههای قدیمی که Android نسخه ۷.x یا پایینتر دارند - برداشتن
android.hardware.graphics.allocator@2.0.so. - بخشهای
productوodmاضافه شدند.