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

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

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

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

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

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

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

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

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