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

پیوند دهنده پویا با دو چالش در طراحی 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

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

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

وقتی 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. name . search.paths نادیده گرفته می شود.

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

این نشان می‌دهد که وقتی ASan فعال است، پیوند دهنده پویا ابتدا /data/asan/system/${LIB} را جستجو می‌کند و سپس /system/${LIB} را جستجو می‌کند.

namespace. name . permitted.paths

فهرستی از دایرکتوری‌ها (شامل زیرشاخه‌ها) جدا شده با کولون که در آن پیوندگر پویا می‌تواند کتابخانه‌های اشتراک‌گذاری شده (علاوه بر search.paths ) را در true isolated بارگیری کند.

کتابخانه های مشترکی که در زیر شاخه های 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() به دست آورد و با ارسال دسته به 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 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 بارگذاری می شوند.

رابطه بین فضاهای نام پیوند دهنده در زیر نشان داده شده است.

نمودار فضای نام پیوند دهنده که در پیکربندی VNDK توضیح داده شده است

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

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

تاریخچه سند

تغییرات اندروید 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}

فایل پیکربندی شامل:

  • چندین ویژگی نگاشت دایرکتوری-بخش در ابتدا برای پیوند دهنده پویا برای انتخاب بخش مؤثر.
  • چندین بخش پیکربندی فضای نام پیوند دهنده:
    • هر بخش شامل چندین فضای نام (راس نمودار) و چندین پیوند بازگشتی بین فضاهای نام (قوس های نمودار) است.
    • هر فضای نام ایزوله، مسیرهای جستجو، مسیرهای مجاز و تنظیمات دید خود را دارد.

جداول زیر معنای هر ویژگی را به تفصیل شرح می دهد.

ویژگی نگاشت بخش دایرکتوری

اموال توضیحات مثال

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

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

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

وقتی 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. name . search.paths نادیده گرفته می شود.

namespace. default. asan.search.paths = /data/asan/system/${LIB}: /system/${LIB}

این نشان می‌دهد که وقتی ASan فعال است، پیوند دهنده پویا ابتدا /data/asan/system/${LIB} را جستجو می‌کند و سپس /system/${LIB} را جستجو می‌کند.

namespace. name . permitted.paths

فهرستی از دایرکتوری‌ها (شامل زیرشاخه‌ها) جدا شده با کولون که در آن پیوندگر پویا می‌تواند کتابخانه‌های اشتراک‌گذاری شده (علاوه بر search.paths ) را در true isolated بارگیری کند.

کتابخانه های مشترکی که در زیر شاخه های 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() به دست آورد و با ارسال دسته به 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 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 بارگذاری می شوند.

رابطه بین فضاهای نام پیوند دهنده در زیر نشان داده شده است.

نمودار فضای نام پیوند دهنده که در پیکربندی VNDK توضیح داده شده است

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

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

تاریخچه سند

تغییرات اندروید 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}

پرونده پیکربندی شامل:

  • چندین ویژگی نقشه برداری از بخش دایرکتوری در ابتدا برای پیوند دهنده پویا برای انتخاب بخش مؤثر.
  • چندین بخش پیکربندی فضای نام لینک دهنده:
    • هر بخش شامل چندین نام نام (راس نمودار) و چندین پیوند برگشتی بین مکان های نام (قوس گراف) است.
    • هر فضای نام از انزوا ، مسیرهای جستجو ، مسیرهای مجاز و تنظیمات دید خود برخوردار است.

جداول زیر معنای هر خاصیت را با جزئیات شرح می دهد.

املاک نقشه برداری بخش دایرکتوری

اموال توضیحات مثال

dir. name

مسیری به دایرکتوری که بخش [ name ] برای آن اعمال می شود.

هر خاصیت اجرایی را در زیر دایرکتوری به بخش پیکربندی نام های نام Linker نقشه می کند. ممکن است دو (یا بیشتر) ویژگی وجود داشته باشد که دارای یک 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

این نشان می دهد که در پیکربندی [system] سه نام ( default ، sphal و vndk ) وجود دارد.

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

این نشان می دهد که پیوند Fallback فقط به عنوان نام کتابخانه درخواست شده فقط 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

این نشان می دهد که تمام نام های کتابخانه می توانند از طریق پیوند Fallback از vndk به فضای نام sphal قدم بزنند.

خصوصیات فضای نام

اموال توضیحات مثال
namespace. name . isolated

یک مقدار بولی که نشان می دهد آیا پیوند دهنده پویا باید بررسی کند که کتابخانه مشترک در کجا ساکن است.

اگر isolated true باشد ، فقط کتابخانه های مشترک که در یکی از دایرکتوری های search.paths هستند (به استثنای زیر مجموعه ها) یا تحت یکی از دایرکتوری های permitted.paths (از جمله زیر مجموعه ها) قرار دارند.

اگر isolated false باشد (پیش فرض) ، پیوند دهنده پویا مسیر کتابخانه های مشترک را بررسی نمی کند.

namespace. sphal. isolated = true

این نشان می دهد که فقط کتابخانه های مشترک در search.paths یا تحت permitted.paths Patts را می توان در فضای نام sphal بارگذاری کرد.

namespace. name . search.paths

لیستی از دایرکتوری های جدا از روده بزرگ برای جستجوی کتابخانه های مشترک.

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

هنگامی که isolated true است ، کتابخانه های مشترک که در یکی از فهرست های search.paths قرار دارند. PATHS (به استثنای زیر مجموعه ها) بدون در نظر گرفتن دارایی permitted.paths . PATHS می توانند بارگیری شوند.

به عنوان مثال ، اگر search.paths باشد /system/${LIB} و permitted.paths خالی است ، /system/${LIB}/libc.so libc.so را می توان بارگیری کرد اما /system/${LIB}/vndk/libutils.so }/vndk/libutils.so نمی تواند بارگیری شود.

namespace. default. search.paths = /system/${LIB}

این نشان می دهد که جستجوگر پیوند دهنده پویا /system/${LIB} برای کتابخانه های مشترک.

namespace. name . asan.search.paths

لیستی از دایرکتوری های جدا از روده بزرگ برای جستجوی کتابخانه های مشترک در هنگام فعال کردن آدرس دهنده (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 true .

کتابخانه های مشترک که تحت زیر مجموعه های permitted.paths قرار دارند. پات ها نیز می توانند بارگیری شوند. به عنوان مثال ، اگر permitted.paths PATHS /system/${LIB} /system/${LIB}/libc.so / $ {libc.so و /system/ $ {lib /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() بدست آورد و با انتقال دسته به android_dlopen_ext() یک کتابخانه مشترک را در فضای نام Linker باز کنید.

اگر 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 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 بارگذاری می شوند.

رابطه بین فضای نام پیوند دهنده در زیر نشان داده شده است.

نمودار فضای نام Linker که در پیکربندی VNDK شرح داده شده است

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

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

تاریخچه سند

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 اضافه می شوند.