एंड्रॉइड 7.0 ने देशी पुस्तकालयों के लिए आंतरिक एपीआई दृश्यता को सीमित करने और उन स्थितियों को हल करने के लिए नामस्थान पेश किए, जहां ऐप्स गलती से अपने स्वयं के बजाय प्लेटफॉर्म पुस्तकालयों का उपयोग करते हैं। एप्लिकेशन-विशिष्ट परिवर्तनों के लिए Android 7.0 Android Developers ब्लॉग पोस्ट में निजी C/C++ प्रतीक प्रतिबंधों के साथ स्थिरता में सुधार देखें।
आर्किटेक्चर
एंड्रॉइड 7.0 और उच्चतर में, सिस्टम लाइब्रेरी को ऐप लाइब्रेरी से अलग किया जाता है।

चित्र 1. देशी पुस्तकालयों के लिए नामस्थान
नेटिव लाइब्रेरी के लिए नेमस्पेस ऐप्स को प्राइवेट-प्लेटफॉर्म नेटिव एपीआई (जैसा कि ओपनएसएसएल के साथ किया गया था) का उपयोग करने से रोकता है। यह उन स्थितियों को भी हटा देता है जहां ऐप्स गलती से अपने स्वयं के बजाय प्लेटफ़ॉर्म लाइब्रेरी का उपयोग करते हैं (जैसा कि libpng
के साथ देखा गया है)। ऐप पुस्तकालयों के लिए दुर्घटना से आंतरिक सिस्टम पुस्तकालयों का उपयोग करना मुश्किल है (और इसके विपरीत)।
अतिरिक्त देशी पुस्तकालय जोड़ना
मानक सार्वजनिक स्थानीय पुस्तकालयों के अलावा, सिलिकॉन विक्रेता (एंड्रॉइड 7.0 से शुरू) और डिवाइस निर्माता (एंड्रॉइड 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
के साथ मेल खाना चाहिए जिसमें लाइब्रेरी का नाम सूचीबद्ध है।
मूल पुस्तकालय जो एओएसपी का हिस्सा हैं, उन्हें सार्वजनिक नहीं किया जाना चाहिए (मानक सार्वजनिक देशी पुस्तकालयों को छोड़कर जो डिफ़ॉल्ट रूप से सार्वजनिक हैं)। केवल सिलिकॉन विक्रेताओं या डिवाइस निर्माताओं द्वारा जोड़े गए अतिरिक्त पुस्तकालयों को ऐप्स के लिए सुलभ बनाया जा सकता है।
एंड्रॉइड 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
-release.csv पर VNDK-SP और LLNDK पुस्तकालयों की सूची खोजें।
गैर-सार्वजनिक मूल पुस्तकालयों का उपयोग न करने के लिए ऐप्स अपडेट करना
यह सुविधा केवल SDK संस्करण 24 या बाद के संस्करण को लक्षित करने वाले अनुप्रयोगों के लिए सक्षम है; पश्चगामी संगतता के लिए, तालिका 1 देखें। यदि आपका ऐप निजी देशी पुस्तकालयों से लिंक हो रहा है तो क्या अपेक्षा करें । ऐप्स के लिए सुलभ एंड्रॉइड नेटिव लाइब्रेरी की सूची (जिसे पब्लिक नेटिव लाइब्रेरी के रूप में भी जाना जाता है) सीडीडी सेक्शन 3.1.1 में सूचीबद्ध है। 24 या बाद के संस्करण को लक्षित करने वाले और किसी भी गैर-सार्वजनिक पुस्तकालयों का उपयोग करने वाले ऐप्स को अपडेट किया जाना चाहिए। अधिक विवरण के लिए एनडीके ऐप्स को प्लेटफ़ॉर्म लाइब्रेरी से लिंक करना देखें।
अपने मूल पुस्तकालय निर्भरताओं के लिए ऐप्स अपडेट करना
एसडीके संस्करण 31 (एंड्रॉइड 12) या उच्चतर को लक्षित करने वाले एप्लिकेशन को ऐप मेनिफेस्ट में <uses-native-library>
टैग का उपयोग करके अपनी मूल साझा लाइब्रेरी निर्भरता को स्पष्ट रूप से निर्दिष्ट करना चाहिए। यदि अनुरोधित लाइब्रेरी का कोई भाग डिवाइस पर मौजूद नहीं है, तो ऐप इंस्टॉल नहीं है। जब ऐप्स इंस्टॉल हो जाते हैं, तो उन्हें केवल मूल साझा लाइब्रेरी प्रदान की जाती हैं जिनका उन्होंने अनुरोध किया है। इसका अर्थ यह है कि ऐप्स ऐसी मूल साझा लाइब्रेरी तक नहीं पहुंच सकते जो ऐप मेनिफेस्ट में दिखाई नहीं देती हैं।