लिंकर नेमस्पेस

डाइनैमिक लिंकर, 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

इससे पता चलता है कि [system] कॉन्फ़िगरेशन में तीन नेमस्पेस (default, sphal, और vndk) हैं.

namespace.name.links

फ़ॉलबैक नेमस्पेस की कॉमा लगाकर अलग की गई सूची.

अगर मौजूदा नेमस्पेस में कोई शेयर की गई लाइब्रेरी नहीं मिलती है, तो डाइनैमिक लिंकर, फ़ॉलबैक नेमस्पेस से शेयर की गई लाइब्रेरी को लोड करने की कोशिश करता है. सूची की शुरुआत में बताए गए नेमस्पेस को ज़्यादा प्राथमिकता दी जाती है.

namespace.sphal.links = default,vndk

अगर शेयर की गई लाइब्रेरी या एक्ज़ीक्यूटेबल ऐसी शेयर की गई लाइब्रेरी का अनुरोध करता है जिसे sphal नेमस्पेस में लोड नहीं किया जा सकता, तो डाइनैमिक लिंकर, default नेमस्पेस से शेयर की गई लाइब्रेरी को लोड करने की कोशिश करता है.

अगर शेयर की गई लाइब्रेरी को default नेमस्पेस से भी लोड नहीं किया जा सकता, तो डाइनैमिक लिंकर, शेयर की गई लाइब्रेरी को vndk नेमस्पेस से लोड करने की कोशिश करता है.

आखिर में, सभी कोशिशों के असफल होने पर, डाइनैमिक लिंकर गड़बड़ी का मैसेज दिखाता है.

namespace.name.link.other.shared_libs

शेयर की गई लाइब्रेरी की सूची, जिसमें लाइब्रेरी को कोलन से अलग किया गया है. इन लाइब्रेरी को name नेमस्पेस में न मिलने पर, इन्हें other नेमस्पेस में खोजा जा सकता है.

इस प्रॉपर्टी का इस्तेमाल, 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

यह एक बूलियन वैल्यू है. इससे पता चलता है कि name नेमस्पेस में लाइब्रेरी न मिलने पर, other नेमस्पेस में सभी शेयर की गई लाइब्रेरी खोजी जा सकती हैं या नहीं.

इस प्रॉपर्टी का इस्तेमाल, 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

इससे पता चलता है कि sphal नेमस्पेस में, सिर्फ़ search.paths या permitted.paths में मौजूद शेयर की गई लाइब्रेरी को लोड किया जा सकता है.

namespace.name.search.paths

शेयर की गई लाइब्रेरी खोजने के लिए, कोलन लगाकर अलग की गई डायरेक्ट्री की सूची.

अगर dlopen() या DT_NEEDED एंट्री में पूरा पाथ नहीं दिया गया है, तो search.paths में बताई गई डायरेक्ट्री को, अनुरोध की गई लाइब्रेरी के नाम से पहले जोड़ दिया जाता है. सूची में सबसे पहले बताई गई डायरेक्ट्री को ज़्यादा प्राथमिकता दी जाती है.

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) चालू हो, तब शेयर की गई लाइब्रेरी खोजने के लिए, डायरेक्ट्री की एक कोलन से अलग की गई सूची.

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

डायरेक्ट्री (सबडायरेक्ट्री) की कोलन से अलग की गई सूची. इसमें isolated के true होने पर डाइनैमिक लिंकर, शेयर की गई लाइब्रेरी (search.paths के अलावा) को लोड कर सकता है.

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, default नेमस्पेस में /system/${LIB}/hw/audio.a2dp.default.so को लोड नहीं कर सकता.

namespace.name.asan.permitted.paths

कोलन से अलग की गई डायरेक्ट्री की सूची, जहां ASan चालू होने पर, डाइनैमिक लिंकर, शेयर की गई लाइब्रेरी को लोड कर सकता है.

ASan चालू होने पर, namespace.name.permitted.paths को अनदेखा कर दिया जाता है.

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 में मिल सकती है.

लिंकर नेमस्पेस आइसोलेशन

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

VNDK Lite कॉन्फ़िगरेशन में बताया गया लिंकर नेमस्पेस ग्राफ़
दूसरी इमेज. लिंकर नेमस्पेस अलग करना (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

नीचे दी गई टेबल में, फ़्रेमवर्क प्रोसेस के लिए नेमस्पेस कॉन्फ़िगरेशन की सूची दी गई है. यह जानकारी 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-NDK
libmediandk.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 सेगमेंट जोड़े गए.