डिवाइस का स्कोप किया गया स्टोरेज

स्कोप वाला स्टोरेज, ऐप्लिकेशन को बाहरी स्टोरेज का ऐक्सेस सीमित करता है. Android 11 या उसके बाद के वर्शन में, एपीआई लेवल 30 या उसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को स्कोप वाला स्टोरेज इस्तेमाल करना होगा. Android 10 में, ऐप्लिकेशन स्कोप वाले स्टोरेज से ऑप्ट आउट कर सकते थे.

ऐप्लिकेशन के ऐक्सेस पर पाबंदियां

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

स्कोप वाले स्टोरेज का इस्तेमाल करने वाले ऐप्लिकेशन के पास, ऐक्सेस के ये लेवल हो सकते हैं. हालांकि, ऐक्सेस का असल लेवल, इसे लागू करने के तरीके पर निर्भर करता है.

  • बिना किसी अनुमति के, अपनी फ़ाइलों को रीड और राइट ऐक्सेस कर सकते हैं
  • READ_EXTERNAL_STORAGE अनुमति लेकर, दूसरे ऐप्लिकेशन की मीडिया फ़ाइलों को रीड ऐक्सेस करना
  • दूसरे ऐप्लिकेशन की मीडिया फ़ाइलों में बदलाव करने का ऐक्सेस सिर्फ़ उपयोगकर्ता की अनुमति के साथ दिया जाता है. हालांकि, System Gallery और सभी फ़ाइलों को ऐक्सेस करने की अनुमति वाले ऐप्लिकेशन के लिए यह शर्त लागू नहीं होती
  • दूसरे ऐप्लिकेशन की बाहरी ऐप्लिकेशन डेटा डायरेक्ट्री को रीड या राइट करने का ऐक्सेस नहीं है

FUSE के साथ स्कोप वाला स्टोरेज इस्तेमाल करना

Android 11 या इसके बाद के वर्शन में, यूज़रस्पेस में फ़ाइल सिस्टम (FUSE) काम करता है. इससे MediaProvider मॉड्यूल, यूज़रस्पेस में फ़ाइल ऑपरेशन की जांच कर सकता है. साथ ही, नीति के आधार पर फ़ाइलों को ऐक्सेस करने की अनुमति दे सकता है, अस्वीकार कर सकता है या सुधार कर सकता है. स्कोप वाले स्टोरेज में मौजूद ऐसे ऐप्लिकेशन जिन्हें FUSE का इस्तेमाल करना है उन्हें स्कोप वाले स्टोरेज की निजता से जुड़ी सुविधाएं मिलती हैं. साथ ही, वे सीधे फ़ाइल पाथ का इस्तेमाल करके फ़ाइलों को ऐक्सेस कर सकते हैं. इसके लिए, ऐप्लिकेशन में File API काम करते रहते हैं.

Android 10 ने MediaProvider के ज़रिए फ़ाइल ऐक्सेस करने पर, स्टोरेज के दायरे से जुड़े नियम लागू किए हैं. हालांकि, ये नियम फ़ाइल के डायरेक्ट पाथ को ऐक्सेस करने पर लागू नहीं होते. उदाहरण के लिए, File API और NDK API का इस्तेमाल करके. ऐसा इसलिए है, क्योंकि कर्नेल कॉल को इंटरसेप्ट करने में ज़्यादा मेहनत लगती है. इस वजह से, सीमित स्टोरेज वाले ऐप्लिकेशन, सीधे फ़ाइल पाथ का इस्तेमाल करके फ़ाइलों को ऐक्सेस नहीं कर पाते थे. इस पाबंदी की वजह से, ऐप्लिकेशन डेवलपर को बदलाव करने में परेशानी हुई. इसकी वजह यह है कि File API के ऐक्सेस को MediaProvider API में फिर से लिखने के लिए, कोड में काफ़ी बदलाव करने पड़ते हैं.

FUSE और SDCardFS

Android 11 में FUSE का इस्तेमाल करने की सुविधा, SDCardFS के बंद होने से जुड़ी नहीं है. हालांकि, यह उन डिवाइसों के लिए Media Store का विकल्प उपलब्ध कराती है जो पहले SDCardFS का इस्तेमाल करते थे. डिवाइस:

  • Android 11 या उसके बाद के वर्शन पर, 5.4 या उसके बाद के वर्शन वाले कर्नेल का इस्तेमाल करके लॉन्च करने पर, SDCardFS का इस्तेमाल नहीं किया जा सकता.
  • Android 11 या उसके बाद के वर्शन पर अपग्रेड करने पर, SDCardFS के ऊपर FUSE होस्ट किया जा सकता है. इससे, फ़ाइल ऑपरेशन को इंटरसेप्ट करने और निजता के लक्ष्यों को पूरा करने में मदद मिलती है.

FUSE की परफ़ॉर्मेंस को बेहतर बनाना

Android 7 या इससे पहले के वर्शन में, Android पर FUSE काम करता था. इसमें बाहरी स्टोरेज को FUSE के तौर पर माउंट किया जाता था. FUSE को लागू करने से परफ़ॉर्मेंस और डेडलॉक से जुड़ी समस्याएं आती थीं. इसलिए, Android 8 में SDCardFS को शामिल किया गया. Android 11 में, libfuse को बेहतर तरीके से लागू करके, FUSE के लिए फिर से सहायता उपलब्ध कराई गई है. इस पर बेहतर तरीके से जांच की गई है. इसे Android 7 या इससे पहले के वर्शन में, परफ़ॉर्मेंस से जुड़ी समस्याओं को हल करने के लिए ट्यून किया जा सकता है.

FUSE ट्यूनिंग में ये बदलाव शामिल हैं:

  • Android/data और Android/obb डायरेक्ट्री के लिए FUSE को बायपास करना, ताकि इन डायरेक्ट्री पर निर्भर गेम ऐप्लिकेशन की परफ़ॉर्मेंस को बेहतर बनाया जा सके.
  • ऑप्टिमाइज़ेशन (जैसे, FUSE फ़ाइल सिस्टम के रीड-अहेड और गड़बड़ी वाले अनुपात को ट्यून करना), ताकि फ़ाइलों को तेज़ी से पढ़ा जा सके और मीडिया को आसानी से चलाया जा सके.
  • FUSE के राइट-बैक कैश मेमोरी का इस्तेमाल करना.
  • सिस्टम सर्वर पर आईपीसी कम करने के लिए, अनुमतियों को कैश मेमोरी में सेव करना.
  • एक साथ कई कार्रवाइयां करने की सुविधा को तेज़ बनाने के लिए, 'सभी फ़ाइलों का ऐक्सेस' वाले ऐप्लिकेशन के लिए ऑप्टिमाइज़ेशन.

ट्यूनिंग में किए गए ऊपर बताए गए बदलावों से, FUSE और बिना FUSE वाले डिवाइसों की परफ़ॉर्मेंस में काफ़ी अंतर नहीं दिखता. उदाहरण के लिए, FUSE का इस्तेमाल करने वाले Pixel 2 और मीडिया स्टोर का इस्तेमाल करने वाले Pixel 2 की जांच करने पर, फ़ाइल पाथ ऐक्सेस और मीडिया स्टोर के बीच, वीडियो चलाने जैसी क्रम से पढ़ने की परफ़ॉर्मेंस की तुलना की गई. हालांकि, FUSE की मदद से, क्रम से लिखने की सुविधा थोड़ी खराब थी. साथ ही, रैंडम रीड और राइटिंग की स्पीड दोगुनी तक हो सकती थी.

परफ़ॉर्मेंस मेज़रमेंट, डिवाइस के हिसाब से और इस्तेमाल के अलग-अलग उदाहरणों के हिसाब से बदल सकते हैं. MediaProvider API सबसे बेहतर परफ़ॉर्म करते हैं. इसलिए, जिन ऐप्लिकेशन डेवलपर को परफ़ॉर्मेंस की चिंता है उन्हें अपने ऐप्लिकेशन के लिए MediaProvider API का इस्तेमाल करना चाहिए.

FUSE की परफ़ॉर्मेंस पर पड़ने वाले असर को कम करना

FUSE की परफ़ॉर्मेंस पर असर सिर्फ़ उन लोगों पर पड़ता है जो बाहरी शेयर किए गए स्टोरेज में सेव की गई फ़ाइलों का ज़्यादा इस्तेमाल करते हैं. FUSE, बाहरी निजी स्टोरेज (जिसमें android/data और android/obb डायरेक्ट्री शामिल हैं) को बायपास करता है. वहीं, डिवाइस का इंटरनल स्टोरेज (जैसे, /data/data, जहां कई ऐप्लिकेशन डेटा को एन्क्रिप्ट (सुरक्षित) और सुरक्षित रखने के लिए स्टोर करते हैं) को FUSE माउंट नहीं किया जाता.

  • शेयर किए गए बाहरी स्टोरेज का कम इस्तेमाल करने वाले ऐप्लिकेशन, आम तौर पर फ़ाइलों के सीमित सेट (आम तौर पर 100 से कम फ़ाइलें) के साथ इंटरैक्ट करते हैं. इन ऐप्लिकेशन को, आम तौर पर फ़ाइलें पढ़ने और लिखने के लिए, पहले से मौजूद ऑप्टिमाइज़ेशन का फ़ायदा मिलता है. साथ ही, Android 11 में इन ऐप्लिकेशन की परफ़ॉर्मेंस पर, FUSE से जुड़ा कोई असर नहीं पड़ेगा.

  • शेयर किए गए बाहरी स्टोरेज का ज़्यादा इस्तेमाल करने वाले ऐप्लिकेशन, आम तौर पर एक साथ कई फ़ाइलों पर कार्रवाइयां करते हैं. जैसे, 1,000 फ़ाइलों वाली डायरेक्ट्री को सूची में शामिल करना या हटाना या फ़ाइल सिस्टम पर एक लाख फ़ाइलों वाली डायरेक्ट्री बनाना या मिटाना. Android 11 पर, फ़ाइलों के एक साथ किए जाने वाले कई कार्रवाइयों पर FUSE का असर पड़ सकता है. हालांकि, अगर ऐसे ऐप्लिकेशन MANAGE_EXTERNAL_STORAGE अनुमति के लिए ज़रूरी शर्तें पूरी करते हैं, तो उन्हें अक्टूबर 2020 के अपडेट में शामिल परफ़ॉर्मेंस ऑप्टिमाइज़ेशन का फ़ायदा मिलता है.

FUSE की परफ़ॉर्मेंस पर पड़ने वाले असर से बचने के लिए, ऐप्लिकेशन बाहरी निजी स्टोरेज में डेटा सेव कर सकते हैं. इसके अलावा, FUSE को बायपास करने और परफ़ॉर्मेंस के लिए ऑप्टिमाइज़ किया गया पाथ पाने के लिए, ContentProvider क्लास में बल्क एपीआई का इस्तेमाल किया जा सकता है. इसके अलावा, MediaProvider सिस्टम कॉम्पोनेंट के अक्टूबर 2020 के अपडेट में, फ़ाइल मैनेजर और उन जैसे ऐप्लिकेशन (जैसे, बैकअप/रिस्टोर, एंटीवायरस) के लिए परफ़ॉर्मेंस को ऑप्टिमाइज़ किया गया है जिनके पास MANAGE_EXTERNAL_STORAGE अनुमति है.

परफ़ॉर्मेंस के बजाय निजता को प्राथमिकता देना

FUSE के लिए ट्यून किए गए डिवाइसों पर, उपयोगकर्ता के ज़्यादातर अहम सफ़र, Android 10 और Android 11, दोनों पर एक जैसी परफ़ॉर्म करते हैं. हालांकि, फ़ाइल ऑपरेशन के सेट पर बेंचमार्क की जांच करते समय, हो सकता है कि Android 11 की परफ़ॉर्मेंस Android 10 से खराब हो. फ़ाइल ऐक्सेस करने के उन पैटर्न के लिए जो Android 11 में खराब परफ़ॉर्म करते हैं (उदाहरण के लिए, रैंडम रीड या राइटिंग), हमारा सुझाव है कि आप MediaProvider API का इस्तेमाल करें. इससे ऐप्लिकेशन को नॉन-फ़्यूज़ ऐक्सेस मोड मिलता है, जो सबसे अच्छा और लगातार बेहतर परफ़ॉर्म करने वाला विकल्प है.

MediaProvider और FUSE से जुड़े अपडेट

Android रिलीज़ के हिसाब से, MediaProvider सिस्टम कॉम्पोनेंट के व्यवहार में अंतर होता है.

  • Android 10 और उससे पहले के वर्शन में, SDCardFS फ़ाइल सिस्टम था और MediaProvider, फ़ाइलों के कलेक्शन (जैसे, इमेज, वीडियो, म्यूज़िक फ़ाइलें वगैरह) के लिए इंटरफ़ेस उपलब्ध कराता था. जब कोई ऐप्लिकेशन, File API का इस्तेमाल करके कोई फ़ाइल बनाता है, तो वह MediaProvider से फ़ाइल को स्कैन करने और उसे डेटाबेस में रिकॉर्ड करने के लिए कह सकता है.

  • Android 11 या इसके बाद के वर्शन में, SDCardFS का इस्तेमाल नहीं किया जा सकता. साथ ही, बाहरी स्टोरेज के लिए MediaProvider, फ़ाइल सिस्टम हैंडलर (FUSE के लिए) बन जाता है. इससे बाहरी स्टोरेज पर मौजूद फ़ाइल सिस्टम और MediaProvider डेटाबेस एक जैसा हो जाता है. FUSE फ़ाइल सिस्टम के लिए यूज़रस्पेस हैंडलर के तौर पर, MediaProvider, कर्नेल कॉल को इंटरसेप्ट कर सकता है. साथ ही, यह पक्का कर सकता है कि फ़ाइल के ऑपरेशन निजता के लिहाज़ से सुरक्षित हों.

Android 11 और उसके बाद के वर्शन में, MediaProvider भी एक मॉड्यूलर सिस्टम कॉम्पोनेंट (मुख्यलाइन मॉड्यूल) है. इसे Android रिलीज़ के बाहर अपडेट किया जा सकता है. इसका मतलब है कि MediaProvider में परफ़ॉर्मेंस, निजता या सुरक्षा से जुड़ी समस्याओं को ठीक किया जा सकता है. साथ ही, उन्हें Google Play Store या पार्टनर की ओर से उपलब्ध कराए गए अन्य तरीकों से, ऑवर-द-एयर डिलीवर किया जा सकता है. FUSE हैंडलर से जो उम्मीद की जाती है उसके दायरे में आने वाली किसी भी चीज़ को अपडेट किया जा सकता है. इससे, FUSE की परफ़ॉर्मेंस में हुई गिरावट और गड़बड़ियों को ठीक करने के लिए अपडेट करने की सुविधा मिलती है.