डाइनैमिक लिंकर, 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
नेमस्पेस में लोड की जाती हैं.
लिंकर नेमस्पेस के बीच के संबंध को नीचे दिखाया गया है.
पहली इमेज. लिंकर नेमस्पेस आइसोलेशन (वीएनडीके कॉन्फ़िगरेशन).
ऊपर दी गई इमेज में, 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 |
एलएल-एनडीके | |
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 |
एलएल-एनडीके | |
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
सेगमेंट जोड़े गए.