भंडारण

Android बाहरी संग्रहण HAL आइकन

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

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

अनुमतियां

बाहरी संग्रहण तक पहुंच विभिन्न Android अनुमतियों द्वारा सुरक्षित है। 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 विशेषता requestLegacyExternalStorage उपयोग करें।

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

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

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

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

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

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