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 से, वेंडर की सार्वजनिक लाइब्रेरी पर ये अतिरिक्त पाबंदियां लागू होती हैं और इन्हें सेटअप करना ज़रूरी होता है:
- वेंडर की नेटिव लाइब्रेरी को सही तरीके से लेबल किया जाना चाहिए, ताकि ऐप्लिकेशन उसे ऐक्सेस कर सकें. अगर किसी ऐप्लिकेशन (इसमें तीसरे पक्ष के ऐप्लिकेशन भी शामिल हैं) को ऐक्सेस करने की ज़रूरत है, तो लाइब्रेरी को वेंडर के हिसाब से
file_contextsफ़ाइल मेंsame_process_hal_fileके तौर पर लेबल किया जाना चाहिए. ऐसा इस तरह से किया जाना चाहिए: यहां/vendor/lib(64)?/libnative.so u:object_r:same_process_hal_file:s0
libnative.so, नेटिव लाइब्रेरी का नाम है. - लाइब्रेरी को सीधे तौर पर या अपनी डिपेंडेंसी के ज़रिए ट्रांज़िटिव तौर पर, वीएनडीके-एसपी और एलएलएनडीके लाइब्रेरी के अलावा, अन्य सिस्टम लाइब्रेरी पर निर्भर नहीं होना चाहिए.
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csvपर जाकर, VNDK-SP और LLNDK लाइब्रेरी की सूची देखें.
Android 15 से, वेंडर की सार्वजनिक लाइब्रेरी को वेंडर एपीईएक्स में रखा जा सकता है. अगर लाइब्रेरी को वेंडर के APEX में पैकेज किया गया है, तो APEX मेनिफ़ेस्ट में मौजूद provideNativeLibs प्रॉपर्टी में लाइब्रेरी की सूची बनाएं.
ऐप्लिकेशन को अपडेट करें, ताकि वे नॉनपब्लिक नेटिव लाइब्रेरी का इस्तेमाल न करें
यह सुविधा सिर्फ़ उन ऐप्लिकेशन के लिए चालू की जाती है जो SDK के 24वें या इसके बाद के वर्शन को टारगेट करते हैं; पिछले वर्शन के साथ काम करने की सुविधा के लिए, पहली टेबल देखें. अगर आपका ऐप्लिकेशन, निजी नेटिव लाइब्रेरी से लिंक हो रहा है, तो क्या होगा. ऐप्लिकेशन के लिए ऐक्सेस की जा सकने वाली Android नेटिव लाइब्रेरी की सूची (इन्हें पब्लिक नेटिव लाइब्रेरी भी कहा जाता है) CDD के सेक्शन 3.1.1 में दी गई है. ऐसे ऐप्लिकेशन जिन्हें Android 14 या इसके बाद के वर्शन को टारगेट करने के लिए बनाया गया है और जो गैर-सार्वजनिक लाइब्रेरी का इस्तेमाल करते हैं उन्हें अपडेट किया जाना चाहिए. ज़्यादा जानकारी के लिए, NDK Apps Linking to Platform Libraries देखें.
नेटिव लाइब्रेरी डिपेंडेंसी के लिए ऐप्लिकेशन अपडेट करना
एसडीके वर्शन 31 (Android 12) या इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को, ऐप्लिकेशन मेनिफ़ेस्ट में <uses-native-library> टैग का इस्तेमाल करके, अपनी नेटिव शेयर की गई लाइब्रेरी की डिपेंडेंसी साफ़ तौर पर बतानी होंगी. अगर अनुरोध की गई लाइब्रेरी का कोई भी हिस्सा डिवाइस पर मौजूद नहीं है, तो ऐप्लिकेशन इंस्टॉल नहीं किया जाता. ऐप्लिकेशन इंस्टॉल होने पर, उन्हें सिर्फ़ वे नेटिव शेयर की गई लाइब्रेरी दी जाती हैं जिनके लिए उन्होंने अनुरोध किया है. इसका मतलब है कि ऐप्लिकेशन, ऐसी नेटिव शेयर की गई लाइब्रेरी को ऐक्सेस नहीं कर सकते जो ऐप्लिकेशन मेनिफ़ेस्ट में नहीं दिखती हैं.