नेटिव लाइब्रेरी के नेमस्पेस

Android 7.0 में, नेटिव लाइब्रेरी के लिए नेमस्पेस पेश किए गए थे. इससे इंटरनल एपीआई की विज़िबिलिटी को सीमित किया जा सकता है. साथ ही, उन स्थितियों को हल किया जा सकता है जहां ऐप्लिकेशन गलती से अपनी लाइब्रेरी के बजाय प्लैटफ़ॉर्म लाइब्रेरी का इस्तेमाल करते हैं. ऐप्लिकेशन से जुड़े बदलावों के बारे में जानने के लिए, Android Developers की ब्लॉग पोस्ट Android 7.0 में प्राइवेट C/C++ सिंबल पर पाबंदियां लगाकर, ऐप्लिकेशन को ज़्यादा भरोसेमंद बनाना पढ़ें.

भवन निर्माण

Android 7.0 और इसके बाद के वर्शन में, सिस्टम लाइब्रेरी को ऐप्लिकेशन लाइब्रेरी से अलग किया जाता है.

नेटिव लाइब्रेरी के लिए नेमस्पेस

पहली इमेज. नेटिव लाइब्रेरी के लिए नेमस्पेस.

नेटिव लाइब्रेरी के लिए नेमस्पेस, ऐप्लिकेशन को प्राइवेट-प्लैटफ़ॉर्म नेटिव एपीआई का इस्तेमाल करने से रोकते हैं. ऐसा OpenSSL के साथ किया गया था. इससे ऐसी स्थितियां भी खत्म हो जाती हैं जहां ऐप्लिकेशन, गलती से अपनी लाइब्रेरी के बजाय प्लैटफ़ॉर्म लाइब्रेरी का इस्तेमाल करते हैं. ऐसा libpng के साथ देखा गया है. ऐप्लिकेशन लाइब्रेरी के लिए, गलती से इंटरनल सिस्टम लाइब्रेरी का इस्तेमाल करना मुश्किल होता है. इसके उलट भी ऐसा ही होता है.

अन्य नेटिव लाइब्रेरी जोड़ना

सिलिकॉन वेंडर (Android 7.0 से शुरू होने वाले वर्शन के लिए) और डिवाइस बनाने वाली कंपनियां (Android 9 से शुरू होने वाले वर्शन के लिए), स्टैंडर्ड पब्लिक नेटिव लाइब्रेरी के अलावा, अतिरिक्त नेटिव लाइब्रेरी उपलब्ध करा सकती हैं. ऐप्लिकेशन इन लाइब्रेरी को ऐक्सेस कर सकते हैं. इसके लिए, उन्हें लाइब्रेरी फ़ोल्डर में रखना होगा और .txt फ़ाइलों में साफ़ तौर पर उनकी सूची बनानी होगी.

लाइब्रेरी फ़ोल्डर ये हैं:

  • सिलिकॉन वेंडर की लाइब्रेरी के लिए, /vendor/lib (32-बिट के लिए) और /vendor/lib64 (64-बिट के लिए)
  • /system/lib (32-बिट के लिए) और /system/lib64 (64-बिट के लिए) डिवाइस बनाने वाली कंपनियों की लाइब्रेरी के लिए

.txt फ़ाइलें ये हैं:

  • सिलिकॉन वेंडर की लाइब्रेरी के लिए /vendor/etc/public.libraries.txt
  • /system/etc/public.libraries-COMPANYNAME.txt, डिवाइस बनाने वाली कंपनियों की लाइब्रेरी के लिए है. यहां COMPANYNAME, डिवाइस बनाने वाली कंपनी के नाम को दिखाता है. जैसे, awesome.company. COMPANYNAME, [A-Za-z0-9_.-]+ से मेल खाना चाहिए. इसमें अल्फ़ान्यूमेरिक वर्ण, _, . होने चाहिए. (डॉट) और - का इस्तेमाल किया जा सकता है. अगर कुछ लाइब्रेरी बाहरी समाधान देने वाली कंपनियों से ली गई हैं, तो डिवाइस में ऐसी कई .txt फ़ाइलें हो सकती हैं.

डिवाइस बनाने वाली कंपनियों की ओर से सार्वजनिक की गई, system पार्टिशन में मौजूद नेटिव लाइब्रेरी का नाम lib*COMPANYNAME.so होना ज़रूरी है. उदाहरण के लिए, libFoo.awesome.company.so. दूसरे शब्दों में, libFoo.so को कंपनी के नाम के सफ़िक्स के बिना सार्वजनिक नहीं किया जाना चाहिए. लाइब्रेरी फ़ाइल के नाम में मौजूद COMPANYNAME, उस txt फ़ाइल के नाम में मौजूद COMPANYNAME से मेल खाना चाहिए जिसमें लाइब्रेरी का नाम दिया गया है.

AOSP का हिस्सा होने वाली नेटिव लाइब्रेरी को सार्वजनिक नहीं किया जाना चाहिए. हालांकि, स्टैंडर्ड पब्लिक नेटिव लाइब्रेरी को सार्वजनिक किया जा सकता है. ये लाइब्रेरी डिफ़ॉल्ट रूप से सार्वजनिक होती हैं. ऐप्लिकेशन के लिए, सिर्फ़ सिलिकॉन वेंडर या डिवाइस बनाने वाली कंपनियों की जोड़ी गई अतिरिक्त लाइब्रेरी को ऐक्सेस किया जा सकता है.

Android 8.0 से, वेंडर की सार्वजनिक लाइब्रेरी पर ये अतिरिक्त पाबंदियां लागू होती हैं और इन्हें सेटअप करना ज़रूरी होता है:

  1. वेंडर की नेटिव लाइब्रेरी को सही तरीके से लेबल किया जाना चाहिए, ताकि ऐप्लिकेशन उसे ऐक्सेस कर सकें. अगर किसी ऐप्लिकेशन (इसमें तीसरे पक्ष के ऐप्लिकेशन भी शामिल हैं) को ऐक्सेस करने की ज़रूरत है, तो लाइब्रेरी को वेंडर के हिसाब से file_contexts फ़ाइल में same_process_hal_file के तौर पर लेबल किया जाना चाहिए. ऐसा इस तरह से किया जाना चाहिए:
    /vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
    यहां libnative.so नेटिव लाइब्रेरी का नाम है.
  2. लाइब्रेरी को सीधे तौर पर या अपनी डिपेंडेंसी के ज़रिए, वीएनडीके-एसपी और एलएलएनडीके लाइब्रेरी के अलावा, अन्य सिस्टम लाइब्रेरी पर निर्भर नहीं होना चाहिए. development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv पर जाकर, VNDK-SP और LLNDK लाइब्रेरी की सूची देखें.

Android 15 से, वेंडर की सार्वजनिक लाइब्रेरी को वेंडर एपीईएक्स में रखा जा सकता है. अगर लाइब्रेरी को वेंडर के APEX में पैकेज किया गया है, तो APEX मेनिफ़ेस्ट में मौजूद provideNativeLibs प्रॉपर्टी में लाइब्रेरी की सूची बनाएं.

ऐप्लिकेशन को अपडेट करें, ताकि वे नॉनपब्लिक नेटिव लाइब्रेरी का इस्तेमाल न करें

यह सुविधा सिर्फ़ उन ऐप्लिकेशन के लिए चालू है जो SDK टूल के वर्शन 24 या इसके बाद के वर्शन को टारगेट करते हैं; पिछले वर्शन के साथ काम करने की सुविधा के लिए, टेबल 1 देखें. अगर आपका ऐप्लिकेशन, निजी नेटिव लाइब्रेरी से लिंक है, तो क्या होगा. ऐप्लिकेशन के लिए ऐक्सेस की जा सकने वाली Android नेटिव लाइब्रेरी की सूची (इन्हें पब्लिक नेटिव लाइब्रेरी भी कहा जाता है) CDD के सेक्शन 3.1.1 में दी गई है. ऐसे ऐप्लिकेशन को अपडेट किया जाना चाहिए जो Android 14 या इसके बाद के वर्शन को टारगेट करते हैं और किसी भी गैर-सार्वजनिक लाइब्रेरी का इस्तेमाल करते हैं. ज़्यादा जानकारी के लिए, NDK Apps Linking to Platform Libraries देखें.

नेटिव लाइब्रेरी डिपेंडेंसी के लिए ऐप्लिकेशन अपडेट करना

एसडीके वर्शन 31 (Android 12) या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को, ऐप्लिकेशन मेनिफ़ेस्ट में <uses-native-library> टैग का इस्तेमाल करके, अपनी नेटिव शेयर की गई लाइब्रेरी की डिपेंडेंसी के बारे में साफ़ तौर पर बताना होगा. अगर अनुरोध की गई लाइब्रेरी का कोई भी हिस्सा डिवाइस पर मौजूद नहीं है, तो ऐप्लिकेशन इंस्टॉल नहीं किया जाता. ऐप्लिकेशन इंस्टॉल होने पर, उन्हें सिर्फ़ वे नेटिव शेयर की गई लाइब्रेरी दी जाती हैं जिनके लिए उन्होंने अनुरोध किया है. इसका मतलब है कि ऐप्लिकेशन, उन नेटिव शेयर की गई लाइब्रेरी को ऐक्सेस नहीं कर सकते जो ऐप्लिकेशन मेनिफ़ेस्ट में नहीं दिखती हैं.