Android 7.0 ने नेटिव लाइब्रेरी के लिए नेमस्पेस लॉन्च किए, ताकि इंटरनल एपीआई को दिखने की सीमा तय की जा सके. साथ ही, उन स्थितियों को ठीक किया जा सके जहां ऐप्लिकेशन, गलती से खुद की लाइब्रेरी के बजाय प्लैटफ़ॉर्म लाइब्रेरी का इस्तेमाल कर लेते हैं. Android 7.0 में निजी C/C++ सिंबल से जुड़ी पाबंदियों की मदद से स्थिरता में सुधार करना Android के डेवलपर ब्लॉग पोस्ट में खास तरह के बदलावों के बारे में जानकारी देखें.
भवन निर्माण
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
, नेटिव लाइब्रेरी का नाम है. - लाइब्रेरी, सीधे तौर पर या अपनी डिपेंडेंसी के ज़रिए, VNDK-SP और LLNDK लाइब्रेरी के अलावा किसी अन्य सिस्टम लाइब्रेरी पर निर्भर नहीं होनी चाहिए.
development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv
पर जाकर, VNDK-SP और LLNDK लाइब्रेरी की सूची देखें.
Android 15 से, वेंडर की सार्वजनिक लाइब्रेरी को वेंडर APEX में रखा जा सकता है. वेंडर APEX में पैकेज करने पर, लाइब्रेरी को APEX मेनिफ़ेस्ट में provideNativeLibs
प्रॉपर्टी में शामिल करें.
ऐप्लिकेशन को अपडेट करके, सार्वजनिक नहीं की गई नेटिव लाइब्रेरी का इस्तेमाल न करने की सुविधा जोड़ना
यह सुविधा सिर्फ़ SDK टूल के वर्शन 24 या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन के लिए चालू है. पुराने सिस्टम के साथ काम करने की सुविधा के लिए, टेबल 1 देखें. अगर आपका ऐप्लिकेशन निजी नेटिव लाइब्रेरी से लिंक हो रहा है, तो क्या होगा. ऐप्लिकेशन के लिए ऐक्सेस की जा सकने वाली Android नेटिव लाइब्रेरी की सूची (जिन्हें सार्वजनिक नेटिव लाइब्रेरी भी कहा जाता है), सीडीडी के सेक्शन 3.1.1 में दी गई है. ऐसे ऐप्लिकेशन जिन्हें 24 या उसके बाद के वर्शन के लिए टारगेट किया गया है और जो किसी भी ऐसी लाइब्रेरी का इस्तेमाल करते हैं जो सार्वजनिक नहीं है उन्हें अपडेट किया जाना चाहिए. ज़्यादा जानकारी के लिए, NDK के ज़रिए प्लैटफ़ॉर्म लाइब्रेरी से लिंक किए गए ऐप्लिकेशन देखें.
ऐप्लिकेशन को उनकी नेटिव लाइब्रेरी डिपेंडेंसी के लिए अपडेट करना
जो ऐप्लिकेशन SDK टूल के वर्शन 31 (Android 12) या इसके बाद के वर्शन को टारगेट करते हैं उन्हें ऐप्लिकेशन मेनिफ़ेस्ट में <uses-native-library>
टैग का इस्तेमाल करके, अपनी नेटिव शेयर की गई लाइब्रेरी डिपेंडेंसी के बारे में साफ़ तौर पर बताना होगा. अगर डिवाइस पर, अनुरोध की गई लाइब्रेरी का कोई हिस्सा मौजूद नहीं है, तो इसका मतलब है कि ऐप्लिकेशन इंस्टॉल नहीं है. ऐप्लिकेशन इंस्टॉल होने के बाद, उन्हें सिर्फ़ वे नेटिव शेयर की गई लाइब्रेरी मिलती हैं जिनका उन्होंने अनुरोध किया है. इसका मतलब है कि ऐप्लिकेशन, उन नेटिव शेयर की गई लाइब्रेरी को ऐक्सेस नहीं कर सकते जो ऐप्लिकेशन मेनिफ़ेस्ट में नहीं दिखती हैं.