स्टोरेज

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

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

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

अनुमतियां

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

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

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

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

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

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

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

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

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

एंड्रॉइड 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() कार्यक्षमता के लिए कम से कम लिनक्स 3.8 की आवश्यकता होती है, लेकिन पैच को सफलतापूर्वक लिनक्स 3.4 में वापस भेज दिया गया है। PermissionsHostTest CTS परीक्षण का उपयोग सही कर्नेल व्यवहार को सत्यापित करने के लिए किया जा सकता है।