स्टोरेज के लिए पारंपरिक तरीके

Android के बाहरी स्टोरेज के एचएएल का आइकॉन

Android, ऐसे डिवाइसों पर काम करता है जिनमें स्टोरेज का पारंपरिक तरीका इस्तेमाल किया जाता है. इसे केस-इन्सेंसिव फ़ाइल सिस्टम कहा जाता है. इसमें POSIX की अनुमति वाली क्लास और मोड में बदलाव नहीं किया जा सकता. पारंपरिक स्टोरेज में, एमुलेट किया गया और पोर्टेबल स्टोरेज शामिल होता है. पोर्टेबल स्टोरेज का मतलब है, ऐसा बाहरी स्टोरेज जिसे सिस्टम ने स्वीकार नहीं किया है. इसलिए, इसे फ़ॉर्मैट और एन्क्रिप्ट नहीं किया गया है या किसी डिवाइस से नहीं जोड़ा गया है. बाहरी स्टोरेज में स्टोर किए गए डेटा को कम से कम सुरक्षा मिलती है. इसलिए, सिस्टम कोड को बाहरी स्टोरेज में संवेदनशील डेटा सेव नहीं करना चाहिए. खास तौर पर, कॉन्फ़िगरेशन और लॉग फ़ाइलों को सिर्फ़ डिवाइस के स्टोरेज में सेव किया जाना चाहिए, जहां उन्हें बेहतर तरीके से सुरक्षित किया जा सके.

एक से ज़्यादा लोगों के लिए बाहरी स्टोरेज

Android 4.2 से, डिवाइसों पर एक से ज़्यादा उपयोगकर्ताओं के लिए खाते बनाए जा सकते हैं. साथ ही, बाहरी स्टोरेज में ये शर्तें पूरी होनी चाहिए:

  • हर उपयोगकर्ता के पास अलग से प्राइमरी स्टोरेज होना चाहिए. साथ ही, उसके पास दूसरे उपयोगकर्ताओं के प्राइमरी स्टोरेज का ऐक्सेस नहीं होना चाहिए.
  • /sdcard पाथ, उपयोगकर्ता के हिसाब से सही मुख्य बाहरी स्टोरेज पर ले जाना चाहिए. यह स्टोरेज, उस उपयोगकर्ता के हिसाब से तय होता है जिसके लिए प्रोसेस चल रही है.
  • Android/obb डायरेक्ट्री में मौजूद बड़ी OBB फ़ाइलों के लिए स्टोरेज को ऑप्टिमाइज़ करने के मकसद से, कई उपयोगकर्ताओं के बीच शेयर किया जा सकता है.
  • ऐप्लिकेशन को सेकंडरी बाहरी स्टोरेज में डेटा नहीं लिखना चाहिए. हालांकि, पैकेज के हिसाब से बनाई गई डायरेक्ट्री में डेटा लिखने की अनुमति दी जा सकती है.

इस सुविधा को प्लैटफ़ॉर्म पर डिफ़ॉल्ट रूप से लागू करने के लिए, Linux kernel के नेमस्पेस का इस्तेमाल किया जाता है. इससे, Zygote से फ़ॉर्क की गई हर प्रोसेस के लिए, अलग-अलग माउंट टेबल बनाई जाती हैं. इसके बाद, उपयोगकर्ता के हिसाब से सही प्राइमरी बाहरी स्टोरेज देने के लिए, बाइंड माउंट का इस्तेमाल किया जाता है.

बूट होने पर, सिस्टम EMULATED_STORAGE_SOURCE पर एक एमुलेटेड बाहरी स्टोरेज FUSE डेमन को माउंट करता है. यह डेमन, ऐप्लिकेशन से छिपा होता है. Zygote के फ़ॉर्क होने के बाद, यह उपयोगकर्ता के हिसाब से सही सबडायरेक्ट्री को FUSE डेमन से EMULATED_STORAGE_TARGET पर बाइंड माउंट करता है, ताकि ऐप्लिकेशन के लिए बाहरी स्टोरेज पाथ सही तरीके से हल हो सकें. किसी ऐप्लिकेशन में, दूसरे उपयोगकर्ताओं के स्टोरेज के लिए ऐक्सेस किए जा सकने वाले माउंट पॉइंट नहीं होते. इसलिए, वे सिर्फ़ उस उपयोगकर्ता के स्टोरेज को ऐक्सेस कर सकते हैं जिसके लिए उसे शुरू किया गया था.

इस सुविधा को लागू करने के लिए, शेयर किए गए सबट्री केरनल की सुविधा का भी इस्तेमाल किया जाता है. इससे, डिफ़ॉल्ट रूट नेमस्पेस से ऐप्लिकेशन नेमस्पेस में माउंट इवेंट को प्रसारित किया जाता है. इससे यह पक्का होता है कि ASEC कंटेनर और OBB माउंट करने जैसी सुविधाएं सही तरीके से काम करती रहें. यह rootfs को शेयर किए गए फ़ोल्डर के तौर पर माउंट करता है. इसके बाद, हर Zygote नेमस्पेस बनने के बाद, इसे स्लेव के तौर पर फिर से माउंट करता है.

एक से ज़्यादा बाहरी स्टोरेज डिवाइस

Android 4.4 से, डेवलपर को Context.getExternalFilesDirs(), Context.getExternalCacheDirs(), और Context.getObbDirs() के ज़रिए कई बाहरी स्टोरेज डिवाइस दिखाए जाते हैं.

इन एपीआई की मदद से दिखाए गए बाहरी स्टोरेज डिवाइस, डिवाइस का कुछ समय के लिए इस्तेमाल किया जाने वाला हिस्सा होने चाहिए. जैसे, बैटरी डिब्बे में मौजूद एसडी कार्ड स्लॉट. डेवलपर को उम्मीद होती है कि इन जगहों पर सेव किया गया डेटा, लंबे समय तक उपलब्ध रहेगा. इस वजह से, इन एपीआई के ज़रिए ट्रांज़िशन स्टोरेज डिवाइसों (जैसे, यूएसबी स्टोरेज ड्राइव) को नहीं दिखाया जाना चाहिए.

WRITE_EXTERNAL_STORAGE अनुमति से, किसी डिवाइस के मुख्य बाहरी स्टोरेज में सिर्फ़ लिखने का ऐक्सेस मिलना चाहिए. ऐप्लिकेशन को दूसरे बाहरी स्टोरेज डिवाइसों पर डेटा सेव करने की अनुमति नहीं दी जानी चाहिए. हालांकि, पैकेज के हिसाब से बनाई गई डायरेक्ट्री में डेटा सेव करने की अनुमति दी जा सकती है. इस तरह से लिखने पर पाबंदी लगाने से यह पक्का होता है कि ऐप्लिकेशन अनइंस्टॉल होने पर, सिस्टम फ़ाइलों को साफ़ कर सके.

यूएसबी मीडिया का इस्तेमाल करने की सुविधा

Android 6.0 पर, ऐसे पोर्टेबल स्टोरेज डिवाइसों का इस्तेमाल किया जा सकता है जिन्हें डिवाइस से सिर्फ़ कुछ समय के लिए कनेक्ट किया जाता है. जैसे, यूएसबी फ़्लैश ड्राइव. जब कोई उपयोगकर्ता कोई नया पोर्टेबल डिवाइस प्लग इन करता है, तो प्लैटफ़ॉर्म उसे एक सूचना दिखाता है. इस सूचना की मदद से, वह उस डिवाइस का कॉन्टेंट कॉपी या मैनेज कर सकता है.

Android 6.0 में, किसी भी डिवाइस को पोर्टेबल माना जाता है जिसे 'डिवाइस के तौर पर इस्तेमाल करें' सुविधा के लिए नहीं चुना गया है. पोर्टेबल स्टोरेज को सिर्फ़ कुछ समय के लिए कनेक्ट किया जाता है. इसलिए, प्लैटफ़ॉर्म पर मीडिया स्कैन करने जैसे ज़्यादा काम नहीं किए जाते. पोर्टेबल स्टोरेज में मौजूद फ़ाइलों को ऐक्सेस करने के लिए, तीसरे पक्ष के ऐप्लिकेशन को स्टोरेज को ऐक्सेस करने का फ़्रेमवर्क इस्तेमाल करना होगा. निजता और सुरक्षा से जुड़ी वजहों से, सीधे ऐक्सेस को साफ़ तौर पर ब्लॉक किया गया है.