भंडारण

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

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

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

अनुमतियां

बाहरी संग्रहण तक पहुंच विभिन्न 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 डेमॉन में कच्चे भंडारण उपकरणों को लपेटकर पूरा किया जाता है।

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

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

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

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

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

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

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

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

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

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