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

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

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

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

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

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

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

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

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

FUSE और SDCardFS

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

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

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

Android के पुराने वर्शन में, Android 7 या उससे पहले के वर्शन में 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 की परफ़ॉर्मेंस के ओवरहेड से बचने के लिए, ऐप्लिकेशन डेटा को बाहरी निजी स्टोरेज में सेव कर सकते हैं या FUSE को बायपास करने और परफ़ॉर्मेंस के लिए ऑप्टिमाइज़ किया गया पाथ पाने के लिए, ContentProvider क्लास में बल्क एपीआई का इस्तेमाल कर सकते हैं. इसके अलावा, 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 फ़ाइल सिस्टम के लिए, उपयोगकर्ता स्पेस हैंडलर के तौर पर, MediaProvider, कर्नेल कॉल को इंटरसेप्ट कर सकता है और यह पक्का कर सकता है कि फ़ाइल ऑपरेशन, निजता के लिहाज़ से सुरक्षित हों.

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