डाइनैमिक लिंकर, Treble VNDK डिज़ाइन में दो चुनौतियों का सामना करता है:
- एसपी-एचएएल की शेयर की गई लाइब्रेरी और उनकी डिपेंडेंसी, फ़्रेमवर्क प्रोसेस में लोड की जाती हैं. इनमें वीएनडीके-एसपी लाइब्रेरी भी शामिल हैं. सिंबल के टकराव को रोकने के लिए, कुछ तरीके होने चाहिए.
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 में, लिंकर कॉन्फ़िगरेशन को रनटाइम पर /linkerconfig में बनाया जाता है. इसके लिए, ${android-src}/system/core/rootdir/etc में सादे टेक्स्ट वाली फ़ाइलों का इस्तेमाल नहीं किया जाता. यह कॉन्फ़िगरेशन, बूट होने के समय जनरेट होता है. यह रनटाइम एनवायरमेंट पर आधारित होता है. इसमें ये आइटम शामिल होते हैं:
- अगर डिवाइस पर वीएनडीके काम करता है
- वेंडर पार्टीशन का टारगेट किया गया वीएनडीके वर्शन
- प्रॉडक्ट पार्टिशन का वीएनडीके वर्शन
- इंस्टॉल किए गए 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 की सुविधा वाले डिवाइसों के अलावा अन्य डिवाइसों के लिए |
वीएनडीके लाइट कॉन्फ़िगरेशन, एसपी-एचएएल और वीएनडीके-एसपी शेयर की गई लाइब्रेरी को अलग करता है. Android 8.0 में, जब PRODUCT_TREBLE_LINKER_NAMESPACES true हो, तब यह डाइनैमिक लिंकर के लिए कॉन्फ़िगरेशन फ़ाइल होनी चाहिए.
वीएनडीके कॉन्फ़िगरेशन, SP-HAL और VNDK-SP शेयर की गई लाइब्रेरी को भी अलग करता है. इसके अलावा, इस कॉन्फ़िगरेशन से, डाइनैमिक लिंकर को पूरी तरह से अलग किया जा सकता है. इससे यह पक्का होता है कि सिस्टम पार्टिशन में मौजूद मॉड्यूल, वेंडर पार्टिशन में मौजूद शेयर की गई लाइब्रेरी पर निर्भर नहीं होंगे. इसके उलट, वेंडर पार्टिशन में मौजूद मॉड्यूल, सिस्टम पार्टिशन में मौजूद शेयर की गई लाइब्रेरी पर निर्भर नहीं होंगे.
Android 8.1 या इसके बाद के वर्शन में, VNDK कॉन्फ़िगरेशन डिफ़ॉल्ट कॉन्फ़िगरेशन होता है. साथ ही, यह सुझाव दिया जाता है कि BOARD_VNDK_VERSION को current पर सेट करके, पूरे डाइनैमिक लिंकर आइसोलेशन को चालू करें.
वीएनडीके कॉन्फ़िगरेशन
वीएनडीके कॉन्फ़िगरेशन, सिस्टम पार्टिशन और वेंडर पार्टिशन के बीच शेयर की गई लाइब्रेरी की डिपेंडेंसी को अलग करता है. पिछले सब-सेक्शन में बताए गए कॉन्फ़िगरेशन की तुलना में, यहां दिए गए कॉन्फ़िगरेशन में ये अंतर हैं:
-
फ़्रेमवर्क प्रोसेस
default,vndk,sphal, औरrsनेमस्पेस बनाए जाते हैं.- सभी नेमस्पेस अलग-अलग होते हैं.
- सिस्टम की शेयर की गई लाइब्रेरी,
defaultनेमस्पेस में लोड की जाती हैं. - SP-HAL को
sphalनेमस्पेस में लोड किया जाता है. - वीएनडीके-एसपी की शेयर की गई लाइब्रेरी,
vndkनेमस्पेस में लोड की जाती हैं.
-
वेंडर की प्रोसेस
default,vndk, औरsystemनेमस्पेस बनाए जाते हैं.defaultनेमस्पेस अलग किया गया है.- वेंडर की शेयर की गई लाइब्रेरी,
defaultनेमस्पेस में लोड की जाती हैं. - वीएनडीके और वीएनडीके-एसपी की शेयर की गई लाइब्रेरी,
vndkनेमस्पेस में लोड की जाती हैं. - LL-NDK और इसकी डिपेंडेंसी,
systemनेमस्पेस में लोड होती हैं.
लिंकर नेमस्पेस के बीच का संबंध यहां दिखाया गया है.
पहली इमेज. लिंकर नेमस्पेस आइसोलेशन (वीएनडीके कॉन्फ़िगरेशन).
ऊपर दी गई इमेज में, 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
[email protected][email protected][email protected][email protected]libRSCpuRef.solibRSDriver.solibRS_internal.solibbase.solibbcinfo.solibc++.solibcutils.solibhardware.solibhidlbase.solibhidlmemory.solibhidltransport.solibhwbinder.solibion.solibutils.solibz.so
डिवाइस पर /linkerconfig/ld.config.txt में जाकर, इस बारे में ज़्यादा जानकारी देखी जा सकती है.
वीएनडीके लाइट कॉन्फ़िगरेशन
Android 8.0 से, डाइनैमिक लिंकर को SP-HAL और VNDK-SP शेयर की गई लाइब्रेरी को अलग करने के लिए कॉन्फ़िगर किया गया है, ताकि उनके सिंबल, फ़्रेमवर्क की शेयर की गई अन्य लाइब्रेरी से न टकराएं. लिंकर नेमस्पेस के बीच का संबंध यहां दिखाया गया है.
एलएल-एनडीके और वीएनडीके-एसपी का मतलब, शेयर की गई ये लाइब्रेरी हैं:
-
LL-NDK
libEGL.solibGLESv1_CM.solibGLESv2.solibc.solibdl.soliblog.solibm.solibnativewindow.solibstdc++.so(कॉन्फ़िगरेशन में नहीं है)libsync.solibvndksupport.solibz.so(कॉन्फ़िगरेशन में VNDK-SP पर ले जाया गया)
-
VNDK-SP
[email protected][email protected][email protected][email protected]libbase.solibc++.solibcutils.solibhardware.solibhidlbase.solibhidlmemory.solibhidltransport.solibhwbinder.solibion.solibutils.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 (कंपाइल किए गए आरएस कर्नल के लिए)
|
|
isolated |
true |
|
visible |
true |
|
links |
default,vndk |
|
link.default.shared_libs |
LL-NDKlibmediandk.solibft2.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लिंकर नेमस्पेस जोड़ा जाता है. साथ ही, वीएनडीके की शेयर की गई लाइब्रेरी को डिफ़ॉल्ट लिंकर नेमस्पेस से अलग किया जाता है. 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.txtVNDK-SP लिंकर नेमस्पेस आइसोलेशन वाले डिवाइसों के लिए ld.config.legacy.txtld.config.legacy.txtAndroid 7.x या इससे पहले के वर्शन पर काम करने वाले लेगसी डिवाइसों के लिए [email protected]को हटाएं.productऔरodmपार्टिशन जोड़े गए हैं.