स्टोरेज

एंड्रॉइड बाह्य भंडारण एचएएल आइकन

एंड्रॉइड विभिन्न प्रकार के स्टोरेज डिवाइस प्रकारों और सुविधाओं का समर्थन करने के लिए समय के साथ विकसित हुआ है। एंड्रॉइड के सभी संस्करण पारंपरिक स्टोरेज वाले उपकरणों का समर्थन करते हैं, जिसमें पोर्टेबल और एमुलेटेड स्टोरेज शामिल हैं। पोर्टेबल स्टोरेज एसडी कार्ड या यूएसबी जैसे भौतिक मीडिया द्वारा प्रदान किया जा सकता है, जो अस्थायी डेटा ट्रांसफर/फ़ाइल स्टोरेज के लिए है। भौतिक मीडिया लंबे समय तक डिवाइस के साथ रह सकता है, लेकिन डिवाइस से बंधा नहीं होता है और उसे हटाया जा सकता है। एंड्रॉइड 1.0 के बाद से एसडी कार्ड पोर्टेबल स्टोरेज के रूप में उपलब्ध हैं; एंड्रॉइड 6.0 में यूएसबी सपोर्ट जोड़ा गया। अनुकरणीय भंडारण एक अनुकरण परत के माध्यम से आंतरिक भंडारण के एक हिस्से को उजागर करके प्रदान किया जाता है और एंड्रॉइड 3.0 के बाद से उपलब्ध है।

एंड्रॉइड 6.0 से शुरू होकर, एंड्रॉइड अपनाने योग्य स्टोरेज का समर्थन करता है, जो एसडी कार्ड या यूएसबी जैसे भौतिक मीडिया द्वारा प्रदान किया जाता है, जिसे आंतरिक स्टोरेज की तरह व्यवहार करने के लिए एन्क्रिप्ट और स्वरूपित किया जाता है। एडॉप्टेबल स्टोरेज सभी प्रकार के एप्लिकेशन डेटा को स्टोर कर सकता है।

अनुमतियां

बाह्य संग्रहण तक पहुंच विभिन्न Android अनुमतियों द्वारा सुरक्षित है। एंड्रॉइड 1.0 से शुरू होकर, लिखने की पहुंच WRITE_EXTERNAL_STORAGE अनुमति से सुरक्षित है। एंड्रॉइड 4.1 में प्रारंभ होकर, पढ़ने की पहुंच READ_EXTERNAL_STORAGE अनुमति से सुरक्षित है।

एंड्रॉइड 4.4 में शुरू होकर, बाहरी स्टोरेज डिवाइस पर फ़ाइलों के मालिक, समूह और मोड को अब निर्देशिका संरचना के आधार पर संश्लेषित किया जाता है। यह ऐप्स को व्यापक WRITE_EXTERNAL_STORAGE अनुमति की आवश्यकता के बिना बाहरी स्टोरेज पर अपने पैकेज-विशिष्ट निर्देशिकाओं को प्रबंधित करने में सक्षम बनाता है। उदाहरण के लिए, पैकेज नाम com.example.foo वाला ऐप अब बिना किसी अनुमति के बाहरी स्टोरेज डिवाइस पर Android/data/com.example.foo/ आसानी से पहुंच सकता है। ये संश्लेषित अनुमतियाँ कच्चे भंडारण उपकरणों को FUSE डेमॉन में लपेटकर पूरी की जाती हैं।

एंड्रॉइड 10 से शुरू होकर, ऐसे ऐप्स जो एंड्रॉइड 9 को लक्षित करते हैं और लीगेसी स्टोरेज के लिए डिफ़ॉल्ट को कम करते हैं, और पृथक स्टोरेज का विकल्प चुन सकते हैं। ऐसे ऐप्स जो एंड्रॉइड 10 को लक्षित करते हैं और अलग-अलग स्टोरेज के लिए डिफ़ॉल्ट हैं, वे अस्थायी रूप से इससे बाहर निकल सकते हैं। डिफ़ॉल्ट स्थिति को बदलने के लिए मेनिफेस्ट विशेषता requestLegacyExternalStorage का उपयोग करें, जो स्टोरेज मॉडल को नियंत्रित करता है।

चूँकि READ_EXTERNAL_STORAGE और WRITE_EXTERNAL_STORAGE दोनों अनुमतियाँ नरम-प्रतिबंधित हैं, यदि इंस्टॉलर ने ऐप को श्वेतसूची में नहीं डाला है, तो अनुमति केवल श्रवण और दृश्य संग्रह तक पहुंच को नियंत्रित करती है, एसडी कार्ड तक पहुंच के बिना। यह तब भी लागू होता है जब ऐप लीगेसी स्टोरेज का अनुरोध करता है। हार्ड प्रतिबंध और सॉफ्ट प्रतिबंध दोनों के बारे में अधिक जानकारी के लिए, एंड्रॉइड 10 में हार्ड और सॉफ्ट प्रतिबंध देखें।

यदि इंस्टॉलर ने अनुमति को श्वेतसूची में डाल दिया है, तो लीगेसी मोड में चल रहे ऐप को गैर-पृथक अनुमति व्यवहार मिलता है। अनुमति एसडी कार्ड पहुंच और श्रवण एवं दृश्य संग्रह को नियंत्रित करती है। ऐसा तब होता है जब या तो ऐप एंड्रॉइड 9 या उससे पहले के संस्करण को लक्षित करता है और पृथक स्टोरेज का विकल्प नहीं चुनता है, या यह एंड्रॉइड 10 को लक्षित करता है और ऑप्ट आउट कर देता है।

श्वेतसूची स्थिति केवल इंस्टॉल के समय निर्दिष्ट की जा सकती है, और ऐप इंस्टॉल होने तक इसे बदला नहीं जा सकता है।

READ_EXTERNAL_STORAGE अनुमति सेट करने के बारे में अधिक जानकारी के लिए, PackageInstaller.SessionParams वर्ग में setWhitelistedRestrictedPermissions() देखें।

एंड्रॉइड 13 उन ऐप्स का समर्थन करने के लिए ग्रैन्युलर मीडिया अनुमतियां पेश करता है जो अन्य ऐप्स द्वारा बनाई गई मीडिया फ़ाइलों तक पहुंचते हैं। ऐप्स को READ_EXTERNAL_STORAGE अनुमति के बजाय ग्रैन्युलर मीडिया अनुमतियों में सूचीबद्ध एक या अधिक ग्रैन्युलर मीडिया अनुमतियों का अनुरोध करना होगा।

जब ऐप्स मीडिया अनुमतियों का अनुरोध करते हैं तो एंड्रॉइड 14 उपयोगकर्ताओं को उनकी विज़ुअल मीडिया लाइब्रेरी तक आंशिक पहुंच प्रदान करने की अनुमति देने के लिए ग्रैन्युलर मीडिया अनुमतियों पर बनाता है। अधिक जानकारी के लिए फ़ोटो और वीडियो तक आंशिक पहुंच प्रदान करें देखें।

रनटाइम अनुमतियाँ

एंड्रॉइड 6.0 एक नया रनटाइम अनुमति मॉडल पेश करता है जहां रनटाइम पर आवश्यकता पड़ने पर ऐप्स क्षमताओं का अनुरोध करते हैं। क्योंकि नए मॉडल में READ/WRITE_EXTERNAL_STORAGE अनुमतियां शामिल हैं, प्लेटफ़ॉर्म को पहले से चल रहे ऐप्स को बंद या पुनरारंभ किए बिना गतिशील रूप से स्टोरेज एक्सेस प्रदान करने की आवश्यकता है। यह सभी माउंटेड स्टोरेज डिवाइसों के तीन अलग-अलग दृश्य बनाए रखकर ऐसा करता है:

  • /mnt/runtime/default बिना किसी विशेष भंडारण अनुमति वाले ऐप्स और रूट नेमस्पेस पर दिखाया जाता है जहां adbd और अन्य सिस्टम घटक रहते हैं।
  • /mnt/runtime/read को READ_EXTERNAL_STORAGE वाले ऐप्स पर दिखाया जाता है (Android 10 के लिए LEGACY_STORAGE सेट करें)
  • /mnt/runtime/write को WRITE_EXTERNAL_STORAGE वाले ऐप्स पर दिखाया जाता है

ज़ीगोट फोर्क समय पर, हम प्रत्येक चल रहे ऐप के लिए एक माउंट नेमस्पेस बनाते हैं और उचित प्रारंभिक दृश्य को जगह पर माउंट करते हैं। बाद में, जब रनटाइम अनुमतियां दी जाती हैं, vold पहले से चल रहे ऐप्स के माउंट नेमस्पेस में कूद जाता है और अपग्रेड किए गए दृश्य को बाइंड माउंट कर देता है। ध्यान दें कि अनुमति डाउनग्रेड के परिणामस्वरूप हमेशा ऐप बंद हो जाता है।

इस सुविधा को लागू करने के लिए उपयोग की जाने वाली setns() कार्यक्षमता के लिए कम से कम Linux 3.8 की आवश्यकता होती है, लेकिन पैच को Linux 3.4 पर सफलतापूर्वक बैकपोर्ट कर दिया गया है। PermissionsHostTest CTS परीक्षण का उपयोग सही कर्नेल व्यवहार को सत्यापित करने के लिए किया जा सकता है।