Storage

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

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

Android 6.0 से, Android में इस्तेमाल किया जा सकने वाला स्टोरेज काम करता है. यह स्टोरेज, एसडी कार्ड या यूएसबी जैसे फ़िज़िकल मीडिया से मिलता है. इसे एन्क्रिप्ट (सुरक्षित) करके, डिवाइस के स्टोरेज की तरह फ़ॉर्मैट किया जाता है. अडॉप्टेबल स्टोरेज में, ऐप्लिकेशन का हर तरह का डेटा सेव किया जा सकता है.

अनुमतियां

बाहरी स्टोरेज का ऐक्सेस, Android की अलग-अलग अनुमतियों से सुरक्षित किया जाता है. Android 1.0 और उसके बाद के वर्शन में, लिखने का ऐक्सेस WRITE_EXTERNAL_STORAGE की अनुमति से सुरक्षित है. Android 4.1 से, पढ़ने का ऐक्सेस READ_EXTERNAL_STORAGE अनुमति से सुरक्षित किया जाता है.

Android 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, दोनों अनुमतियों पर कुछ पाबंदियां हैं. अगर इंस्टॉलर ने ऐप्लिकेशन को व्हाइटलिस्ट नहीं किया है, तो अनुमति सिर्फ़ ऑडियो और विज़ुअल कलेक्शन का ऐक्सेस कंट्रोल करती है. साथ ही, SD कार्ड का ऐक्सेस नहीं देती. यह तब भी लागू होता है, जब ऐप्लिकेशन, लेगसी स्टोरेज का अनुरोध करता है. सख्त पाबंदियों और सामान्य पाबंदियों, दोनों के बारे में ज़्यादा जानने के लिए, Android 10 में सख्त और सामान्य पाबंदियां लेख पढ़ें.

अगर इंस्टॉलर ने अनुमति को वाइटलिस्ट में शामिल किया है, तो लेगसी मोड में चल रहे ऐप्लिकेशन को अनुमति का अलग-अलग व्यवहार नहीं मिलता. इस अनुमति से, एसडी कार्ड का ऐक्सेस और ऑडियो और विज़ुअल कलेक्शन को कंट्रोल किया जाता है. ऐसा तब होता है, जब ऐप्लिकेशन Android 9 या इससे पहले के वर्शन को टारगेट करता है और अलग से स्टोर किए जाने वाले डेटा के लिए ऑप्ट इन नहीं करता है. इसके अलावा, ऐसा तब भी होता है, जब ऐप्लिकेशन Android 10 को टारगेट करता है और अलग से स्टोर किए जाने वाले डेटा के लिए ऑप्ट आउट करता है.

व्हाइटलिस्ट की स्थिति सिर्फ़ इंस्टॉल के समय तय की जा सकती है. साथ ही, ऐप्लिकेशन के इंस्टॉल होने तक इसे बदला नहीं जा सकता.

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

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

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

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

Android 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 वाली सुविधा वाले ऐप्लिकेशन पर दिखता है

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

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