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

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

ऐप्लिकेशन के ऐक्सेस से जुड़ी पाबंदियां

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

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

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

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

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

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 में, FUSE के लिए फिर से सहायता उपलब्ध कराई गई है. इसके लिए, libfuse के बेहतर तरीके से लागू किए गए वर्शन का इस्तेमाल किया गया है. इसे Android 7 या इससे पहले के वर्शन में परफ़ॉर्मेंस से जुड़ी समस्याओं को हल करने के लिए ट्यून किया जा सकता है.

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

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

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

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

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

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

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

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

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

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

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

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

MediaProvider सिस्टम कॉम्पोनेंट का व्यवहार, Android के अलग-अलग वर्शन में अलग-अलग होता है.

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

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

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