डाइनैमिक लिंकर, 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 चालू होने पर, |
इससे पता चलता है कि ASan चालू होने पर, |
namespace. |
बूलियन वैल्यू, जो यह बताती है कि अगर अगर |
इससे पता चलता है कि |
लिंकर नेमस्पेस बनाना
Android 11 में, लिंकर कॉन्फ़िगरेशन, ${android-src}/system/core/rootdir/etc
में मौजूद सादे टेक्स्ट फ़ाइलों का इस्तेमाल करने के बजाय, /linkerconfig
में रनटाइम के दौरान बनाया जाता है. कॉन्फ़िगरेशन, रनटाइम एनवायरमेंट के आधार पर, बूट होने के समय जनरेट होता है. इसमें ये आइटम शामिल होते हैं:
- अगर डिवाइस पर VNDK काम करता है
- वेंडर पार्टीशन का टारगेट VNDK वर्शन
- प्रॉडक्ट के VNDK वर्शन का ब्यौरा
- इंस्टॉल किए गए APEX मॉड्यूल
लिंकर कॉन्फ़िगरेशन, लिंकर नेमस्पेस के बीच की डिपेंडेंसी को हल करके बनाया जाता है. उदाहरण के लिए, अगर APEX मॉड्यूल में कोई अपडेट होता है, जिसमें डिपेंडेंसी अपडेट शामिल होते हैं, तो लिंकर कॉन्फ़िगरेशन जनरेट होता है. इसमें ये बदलाव दिखते हैं. लिंकर कॉन्फ़िगरेशन बनाने के बारे में ज़्यादा जानकारी पाने के लिए,
${android-src}/system/linkerconfig
पर जाएं.
लिंकर नेमस्पेस आइसोलेशन
कॉन्फ़िगरेशन तीन तरह के होते हैं. BoardConfig.mk
में PRODUCT_TREBLE_LINKER_NAMESPACES
और
BOARD_VNDK_VERSION
की वैल्यू के आधार पर, बूट के समय उससे जुड़ा कॉन्फ़िगरेशन जनरेट होता है.
PRODUCT_TREBLE_ LINKER_NAMESPACES |
BOARD_VNDK_ VERSION |
चुना गया कॉन्फ़िगरेशन | वीटीएस से जुड़ी ज़रूरी शर्तें |
---|---|---|---|
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 8.1 या इसके बाद के वर्शन में, VNDK कॉन्फ़िगरेशन डिफ़ॉल्ट कॉन्फ़िगरेशन होता है. साथ ही, हमारा सुझाव है कि BOARD_VNDK_VERSION
को current
पर सेट करके, पूरी तरह से डाइनैमिक लिंकर आइसोलेशन की सुविधा चालू करें.
VNDK कॉन्फ़िगरेशन
VNDK कॉन्फ़िगरेशन, शेयर की गई लाइब्रेरी की डिपेंडेंसी को सिस्टम पार्टीशन और वेंडर पार्टीशन के बीच अलग-अलग रखता है. पिछले सब-सेक्शन में बताए गए कॉन्फ़िगरेशन की तुलना में, इनमें अंतर इस तरह है:
-
फ़्रेमवर्क की प्रोसेस
default
,vndk
,sphal
, औरrs
नेमस्पेस बनाए जाते हैं.- सभी नेमस्पेस अलग-अलग होते हैं.
- सिस्टम की शेयर की गई लाइब्रेरी,
default
नेमस्पेस में लोड होती हैं. - SP-HAL,
sphal
नेमस्पेस में लोड किए जाते हैं. vndk
नेमस्पेस में लोड की गई VNDK-SP की शेयर की गई लाइब्रेरी.
-
वेंडर की प्रोसेस
default
,vndk
, औरsystem
नेमस्पेस बनाए गए हैं.default
नेमस्पेस को अलग किया गया है.- वेंडर की शेयर की गई लाइब्रेरी,
default
नेमस्पेस में लोड होती हैं. - VNDK और VNDK-SP की शेयर की गई लाइब्रेरी,
vndk
नेमस्पेस में लोड की जाती हैं. - LL-NDK और उसकी डिपेंडेंसी,
system
नेमस्पेस में लोड की जाती हैं.
लिंकर नेमस्पेस के बीच के संबंध को नीचे दिखाया गया है.

पहली इमेज. लिंकर नेमस्पेस आइसोलेशन (VNDK कॉन्फ़िगरेशन).
ऊपर दी गई इमेज में, LL-NDK और VNDK-SP, शेयर की गई इन लाइब्रेरी के लिए हैं:
-
LL-NDK
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libGLESv3.so
libandroid_net.so
libc.so
libdl.so
liblog.so
libm.so
libnativewindow.so
libneuralnetworks.so
libsync.so
libvndksupport.so
libvulkan.so
-
VNDK-SP
android.hardware.graphics.common@1.0.so
android.hardware.graphics.mapper@2.0.so
android.hardware.renderscript@1.0.so
android.hidl.memory@1.0.so
libRSCpuRef.so
libRSDriver.so
libRS_internal.so
libbase.so
libbcinfo.so
libc++.so
libcutils.so
libhardware.so
libhidlbase.so
libhidlmemory.so
libhidltransport.so
libhwbinder.so
libion.so
libutils.so
libz.so
ज़्यादा जानकारी के लिए, डिवाइस पर /linkerconfig/ld.config.txt
पर जाएं.
VNDK Lite कॉन्फ़िगरेशन
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
नीचे दी गई टेबल में, फ़्रेमवर्क प्रोसेस के लिए नेमस्पेस कॉन्फ़िगरेशन की सूची दी गई है. यह सूची, VNDK Lite कॉन्फ़िगरेशन के [system]
सेक्शन से ली गई है.
नेमस्पेस | प्रॉपर्टी | वैल्यू |
---|---|---|
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 |
नीचे दी गई टेबल में, वेंडर प्रोसेस के लिए नेमस्पेस कॉन्फ़िगरेशन दिखाया गया है. इसे VNDK Lite कॉन्फ़िगरेशन के [vendor]
सेक्शन से लिया गया है.
नेमस्पेस | प्रॉपर्टी | वैल्यू |
---|---|---|
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.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
पार्टिशन जोड़े गए हैं.