मूल पुस्तकालयों के लिए नामस्थान

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

वास्तुकला

एंड्रॉइड 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 से मेल खाना चाहिए जिसमें लाइब्रेरी का नाम सूचीबद्ध है।

मूल पुस्तकालय जो AOSP का हिस्सा हैं, उन्हें सार्वजनिक नहीं किया जाना चाहिए (मानक सार्वजनिक देशी पुस्तकालयों को छोड़कर जो डिफ़ॉल्ट रूप से सार्वजनिक हैं)। केवल सिलिकॉन विक्रेताओं या डिवाइस निर्माताओं द्वारा जोड़ी गई अतिरिक्त लाइब्रेरी को ही ऐप्स तक पहुंच योग्य बनाया जा सकता है।

एंड्रॉइड 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. लाइब्रेरी, अपनी निर्भरता के माध्यम से सीधे या अस्थायी रूप से, VNDK-SP और LLNDK लाइब्रेरी के अलावा अन्य सिस्टम लाइब्रेरी पर निर्भर नहीं होनी चाहिए। VNDK-SP और LLNDK लाइब्रेरी की सूची development/vndk/tools/definition/tool/datasets/eligible-list-<version>-release.csv पर ढूंढें।

गैर-सार्वजनिक स्थानीय पुस्तकालयों का उपयोग न करने के लिए ऐप्स अपडेट करना

यह सुविधा केवल SDK संस्करण 24 या उसके बाद के संस्करण को लक्षित करने वाले अनुप्रयोगों के लिए सक्षम है; बैकवर्ड अनुकूलता के लिए, तालिका 1 देखें। यदि आपका ऐप निजी देशी पुस्तकालयों के विरुद्ध लिंक कर रहा है तो क्या उम्मीद करें । ऐप्स के लिए पहुंच योग्य एंड्रॉइड देशी पुस्तकालयों की सूची (सार्वजनिक देशी पुस्तकालयों के रूप में भी जानी जाती है) सीडीडी अनुभाग 3.1.1 में सूचीबद्ध है। 24 या उससे अधिक को लक्षित करने वाले और किसी गैर-सार्वजनिक लाइब्रेरी का उपयोग करने वाले ऐप्स को अपडेट किया जाना चाहिए। अधिक विवरण के लिए एनडीके ऐप्स को प्लेटफ़ॉर्म लाइब्रेरी से लिंक करना देखें।

उनकी मूल लाइब्रेरी निर्भरता के लिए ऐप्स अपडेट करना

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