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

डाइनैमिक लिंकर, 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 कॉन्फ़िगरेशन में बताया गया लिंकर नेमस्पेस ग्राफ़

पहली इमेज. लिंकर नेमस्पेस आइसोलेशन (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 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-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 पार्टिशन जोड़े गए हैं.