डायनामिक लिंकर ट्रेबल 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]/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. namespaces | अनुभाग के लिए अतिरिक्त नामस्थानों ( | यह इंगित करता है कि |
namespace. name . links | फ़ॉलबैक नामस्थानों की अल्पविराम से अलग की गई सूची। यदि कोई साझा लाइब्रेरी वर्तमान नेमस्पेस में नहीं मिल पाती है, तो डायनेमिक लिंकर फ़ॉलबैक नेमस्पेस से साझा लाइब्रेरी को लोड करने का प्रयास करता है। सूची की शुरुआत में निर्दिष्ट नामस्थान की प्राथमिकता उच्च है। | यदि कोई साझा लाइब्रेरी या निष्पादन योग्य एक साझा लाइब्रेरी का अनुरोध करता है जिसे और फिर, यदि साझा लाइब्रेरी को अंत में, यदि सभी प्रयास विफल हो जाते हैं, तो डायनेमिक लिंकर एक त्रुटि देता है। |
namespace. name . link. other . shared_libs | साझा लाइब्रेरीज़ की एक कोलन-पृथक सूची जिसे इस प्रॉपर्टी का उपयोग | यह इंगित करता है कि फ़ॉलबैक लिंक अनुरोधित लाइब्रेरी नाम के रूप में केवल |
namespace. name . link. other . allow_all_shared_libs | एक बूलियन मान जो इंगित करता है कि क्या सभी साझा लाइब्रेरीज़ को इस प्रॉपर्टी का उपयोग | यह इंगित करता है कि सभी लाइब्रेरी नाम |
नेमस्पेस गुण
संपत्ति | विवरण | उदाहरण |
---|---|---|
namespace. name . isolated | एक बूलियन मान जो इंगित करता है कि डायनेमिक लिंकर को यह जांचना चाहिए कि साझा लाइब्रेरी कहाँ स्थित है। यदि यदि | यह इंगित करता है कि केवल |
namespace. name . search.paths | साझा पुस्तकालयों की खोज के लिए निर्देशिकाओं की एक कोलन-पृथक सूची। यदि फ़ंक्शन कॉल जब उदाहरण के लिए, यदि | यह इंगित करता है कि डायनामिक लिंकर साझा पुस्तकालयों के लिए |
namespace. name . asan.search.paths | एड्रेससैनिटाइज़र (एएसएएन) सक्षम होने पर साझा लाइब्रेरी की खोज के लिए निर्देशिकाओं की एक कोलन-पृथक सूची। | यह इंगित करता है कि जब ASan सक्षम होता है तो डायनामिक लिंकर पहले |
namespace. name . permitted.paths | निर्देशिकाओं की एक कोलन-पृथक सूची (उपनिर्देशिकाओं सहित) जहां डायनेमिक लिंकर साझा लाइब्रेरियाँ जो यदि | यह इंगित करता है कि उदाहरण के लिए, |
namespace. name . asan.permitted.paths | निर्देशिकाओं की एक कोलन-पृथक सूची जहां डायनेमिक लिंकर ASan सक्षम होने पर साझा लाइब्रेरी को लोड कर सकता है। | यह इंगित करता है कि जब ASan सक्षम होता है |
namespace. name . visible | एक बूलियन मान जो इंगित करता है कि क्या प्रोग्राम ( यदि यदि | यह इंगित करता है कि |
लिंकर नेमस्पेस निर्माण
एंड्रॉइड 11 में, ${android-src}/system/core/rootdir/etc
में सादे टेक्स्ट फ़ाइलों का उपयोग करने के बजाय /linkerconfig
के तहत रनटाइम पर लिंकर कॉन्फ़िगरेशन बनाया जाता है। कॉन्फ़िगरेशन रनटाइम वातावरण के आधार पर बूट समय पर उत्पन्न होता है, जिसमें निम्नलिखित आइटम शामिल होते हैं:
- यदि डिवाइस VNDK को सपोर्ट करता है
- विक्रेता विभाजन का लक्ष्य VNDK संस्करण
- उत्पाद विभाजन का VNDK संस्करण
- स्थापित एपेक्स मॉड्यूल
लिंकर कॉन्फ़िगरेशन लिंकर नेमस्पेस के बीच निर्भरता को हल करके बनाया गया है। उदाहरण के लिए, यदि APEX मॉड्यूल पर कोई अपडेट है जिसमें निर्भरता अपडेट शामिल है, तो इन परिवर्तनों को दर्शाते हुए लिंकर कॉन्फ़िगरेशन उत्पन्न होता है। लिंकर कॉन्फ़िगरेशन बनाने के लिए अधिक विवरण ${android-src}/system/linkerconfig
में पाया जा सकता है।
लिंकर नेमस्पेस अलगाव
तीन कॉन्फ़िगरेशन प्रकार हैं. BoardConfig.mk
में PRODUCT_TREBLE_LINKER_NAMESPACES
और BOARD_VNDK_VERSION
के मान के आधार पर, संबंधित कॉन्फ़िगरेशन बूट समय पर उत्पन्न होता है।
PRODUCT_TREBLE_ LINKER_NAMESPACES | BOARD_VNDK_ VERSION | चयनित कॉन्फ़िगरेशन | वीटीएस आवश्यकता |
---|---|---|---|
true | current | VNDK | एंड्रॉइड 9 या उच्चतर के साथ लॉन्च किए गए उपकरणों के लिए अनिवार्य |
खाली | VNDK Lite | Android 8.x के साथ लॉन्च किए गए उपकरणों के लिए अनिवार्य | |
false | खाली | Legacy | गैर-तिहरा उपकरणों के लिए |
VNDK लाइट कॉन्फ़िगरेशन SP-HAL और VNDK-SP साझा लाइब्रेरी को अलग करता है। Android 8.0 में, PRODUCT_TREBLE_LINKER_NAMESPACES
true
होने पर यह डायनामिक लिंकर के लिए कॉन्फ़िगरेशन फ़ाइल होनी चाहिए।
VNDK कॉन्फ़िगरेशन SP-HAL और VNDK-SP साझा लाइब्रेरी को भी अलग करता है। इसके अलावा, यह कॉन्फ़िगरेशन पूर्ण गतिशील लिंकर अलगाव प्रदान करता है। यह सुनिश्चित करता है कि सिस्टम विभाजन में मॉड्यूल विक्रेता विभाजन में साझा लाइब्रेरी पर निर्भर नहीं होंगे और इसके विपरीत।
एंड्रॉइड 8.1 या उच्चतर में, VNDK कॉन्फ़िगरेशन डिफ़ॉल्ट कॉन्फ़िगरेशन है और BOARD_VNDK_VERSION
को current
पर सेट करके पूर्ण डायनामिक लिंकर अलगाव को सक्षम करने की अत्यधिक अनुशंसा की जाती है।
वीएनडीके विन्यास
VNDK कॉन्फ़िगरेशन सिस्टम विभाजन और विक्रेता विभाजन के बीच साझा लाइब्रेरी निर्भरता को अलग करता है। पिछले उपधारा में उल्लिखित कॉन्फ़िगरेशन की तुलना में, अंतर निम्नानुसार उल्लिखित हैं:
फ़्रेमवर्क प्रक्रियाएँ
-
default
,vndk
,sphal
, औरrs
नेमस्पेस बनाए जाते हैं। - सभी नामस्थान पृथक हैं.
- सिस्टम साझा लाइब्रेरीज़ को
default
नेमस्पेस में लोड किया जाता है। - एसपी-एचएएल को
sphal
नेमस्पेस में लोड किया जाता है। - VNDK-SP साझा लाइब्रेरीज़ को
vndk
नेमस्पेस में लोड किया गया।
-
विक्रेता प्रक्रियाएँ
-
default
,vndk
, औरsystem
नेमस्पेस बनाए जाते हैं। -
default
नामस्थान पृथक है. - विक्रेता साझा लाइब्रेरीज़ को
default
नेमस्पेस में लोड किया जाता है। - VNDK और VNDK-SP साझा लाइब्रेरी को
vndk
नेमस्पेस में लोड किया गया है। - एलएल-एनडीके और इसकी निर्भरताएं
system
नेमस्पेस में लोड की जाती हैं।
-
लिंकर नामस्थानों के बीच संबंध नीचे दर्शाया गया है।
ऊपर की छवि में, एलएल-एनडीके और वीएनडीके-एसपी निम्नलिखित साझा पुस्तकालयों के लिए हैं:
- एलएल-एनडीके
-
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
-
- वीएनडीके-एसपी
-
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
में अधिक विवरण पा सकते हैं।
वीएनडीके लाइट कॉन्फ़िगरेशन
एंड्रॉइड 8.0 के अनुसार, डायनेमिक लिंकर को एसपी-एचएएल और वीएनडीके-एसपी साझा लाइब्रेरी को अलग करने के लिए कॉन्फ़िगर किया गया है ताकि उनके प्रतीक अन्य फ्रेमवर्क साझा लाइब्रेरी के साथ संघर्ष न करें। लिंकर नामस्थानों के बीच संबंध नीचे दिखाया गया है।
एलएल-एनडीके और वीएनडीके-एसपी निम्नलिखित साझा पुस्तकालयों के लिए हैं:
- एलएल-एनडीके
-
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 पर ले जाया गया)
-
- वीएनडीके-एसपी
-
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]
अनुभाग से उद्धृत किया गया है।
नाम स्थान | संपत्ति | कीमत |
---|---|---|
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 | वीएनडीके-एसपी | |
link.rs.shared_libs | libRS_internal.so | |
vndk (वीएनडीके-एसपी के लिए) | 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 (रेंडरस्क्रिप्ट के लिए) | 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 | एलएल-एनडीकेlibmediandk.so libft2.so | |
link.vndk.shared_libs | वीएनडीके-एसपी |
नीचे दी गई तालिका विक्रेता प्रक्रियाओं के लिए नेमस्पेस कॉन्फ़िगरेशन प्रस्तुत करती है, जो VNDK लाइट कॉन्फ़िगरेशन में [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
में पाया जा सकता है।
दस्तावेज़ इतिहास
एंड्रॉइड 11 में बदलाव
- एंड्रॉइड 11 में, स्थिर
ld.config.*.txt
फ़ाइलें कोडबेस से हटा दी जाती हैं और LinkerConfig उन्हें रनटाइम में उत्पन्न करता है।
एंड्रॉइड 9 में बदलाव
- एंड्रॉइड 9 में,
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
विभाजन जोड़े जाते हैं।