फ़्यूज़ पासथ्रू

एंड्रॉइड 12 FUSE पासथ्रू का समर्थन करता है, जो निचले फ़ाइल सिस्टम तक सीधी पहुंच के बराबर प्रदर्शन प्राप्त करने के लिए FUSE ओवरहेड को कम करता है। FUSE पासथ्रू android12-5.4 , android12-5.10 , और android-mainline (केवल परीक्षण) कर्नेल में समर्थित है, जिसका अर्थ है कि इस सुविधा के लिए समर्थन डिवाइस द्वारा उपयोग किए गए कर्नेल और डिवाइस पर चलने वाले Android के संस्करण पर निर्भर करता है:

  • एंड्रॉइड 11 से एंड्रॉइड 12 में अपग्रेड करने वाले डिवाइस FUSE पासथ्रू का समर्थन नहीं कर सकते क्योंकि इन डिवाइसों के लिए कर्नेल जमे हुए हैं और वे उस कर्नेल में नहीं जा सकते हैं जिसे आधिकारिक तौर पर FUSE पासथ्रू परिवर्तनों के साथ अपग्रेड किया गया है।

  • एंड्रॉइड 12 के साथ लॉन्च होने वाले डिवाइस आधिकारिक कर्नेल का उपयोग करते समय FUSE पासथ्रू का समर्थन कर सकते हैं। ऐसे उपकरणों के लिए, एंड्रॉइड फ्रेमवर्क कोड जो FUSE पासथ्रू को लागू करता है, MediaProvider मेनलाइन मॉड्यूल में एम्बेडेड होता है, जो स्वचालित रूप से अपग्रेड हो जाता है। वे डिवाइस जो MediaProvider को मेनलाइन मॉड्यूल के रूप में लागू नहीं करते हैं (उदाहरण के लिए, Android Go डिवाइस), वे MediaProvider परिवर्तनों तक भी पहुंच सकते हैं क्योंकि वे सार्वजनिक रूप से साझा किए जाते हैं।

FUSE बनाम SDCardFS

यूजरस्पेस में फाइल सिस्टम (FUSE) एक ऐसा तंत्र है जो FUSE फाइल सिस्टम पर किए गए ऑपरेशन को कर्नेल (FUSE ड्राइवर) द्वारा यूजरस्पेस प्रोग्राम (FUSE डेमॉन) को आउटसोर्स करने की अनुमति देता है, जो ऑपरेशन को लागू करता है। एंड्रॉइड 11 ने SDCardFS को हटा दिया और FUSE को स्टोरेज इम्यूलेशन के लिए डिफ़ॉल्ट समाधान बना दिया। इस परिवर्तन के हिस्से के रूप में, एंड्रॉइड ने फ़ाइल एक्सेस को रोकने, अतिरिक्त सुरक्षा और गोपनीयता सुविधाओं को लागू करने और रनटाइम पर फ़ाइलों में हेरफेर करने के लिए अपना स्वयं का FUSE डेमॉन लागू किया।

जबकि FUSE पृष्ठों या विशेषताओं जैसी कैश करने योग्य जानकारी से निपटने में अच्छा प्रदर्शन करता है, यह बाहरी भंडारण तक पहुंचने पर प्रदर्शन प्रतिगमन का परिचय देता है जो विशेष रूप से मध्य और निम्न-अंत उपकरणों में दिखाई देता है। ये प्रतिगमन FUSE फ़ाइल सिस्टम के कार्यान्वयन में सहयोग करने वाले घटकों की एक श्रृंखला के साथ-साथ FUSE ड्राइवर और FUSE डेमॉन के बीच संचार में कर्नेल स्थान से उपयोगकर्ता स्थान पर कई स्विच के कारण होते हैं (निचली फ़ाइल तक सीधी पहुंच की तुलना में) वह प्रणाली जो दुबली है और पूरी तरह से कर्नेल में कार्यान्वित है)।

इन प्रतिगमन को कम करने के लिए, ऐप्स डेटा कॉपी को कम करने के लिए स्प्लिसिंग का उपयोग कर सकते हैं और निचली फ़ाइल सिस्टम फ़ाइलों तक सीधी पहुंच प्राप्त करने के लिए कंटेंटप्रोवाइडर एपीआई का उपयोग कर सकते हैं। इन और अन्य अनुकूलन के साथ भी, FUSE का उपयोग करते समय पढ़ने और लिखने के संचालन में कम बैंडविड्थ देखी जा सकती है, जब निचले फ़ाइल सिस्टम तक सीधी पहुंच की तुलना की जाती है - विशेष रूप से यादृच्छिक पढ़ने के संचालन के साथ, जहां कोई कैशिंग या रीड-फ़ॉरवर्ड मदद नहीं कर सकता है। और जो ऐप्स लीगेसी /sdcard/ पथ के माध्यम से सीधे स्टोरेज तक पहुंचते हैं, उन्हें ध्यान देने योग्य प्रदर्शन में गिरावट का अनुभव होता रहता है, खासकर IO-सघन संचालन करते समय।

SDcardFS उपयोक्तास्थान अनुरोध

SDcardFS का उपयोग कर्नेल से यूजर स्पेस कॉल को हटाकर FUSE के स्टोरेज इम्यूलेशन और अनुमति जांच को तेज कर सकता है। यूज़रस्पेस अनुरोध पथ का अनुसरण करते हैं: यूज़रस्पेस → VFS → sdcardfs → VFS → ext4 → पेज कैश/स्टोरेज।

फ्यूज पासथ्रू एसडीकार्डएफएस

चित्र 1. SDcardFS उपयोक्तास्थान अनुरोध

FUSE उपयोक्तास्थान अनुरोध

FUSE का उपयोग शुरू में स्टोरेज इम्यूलेशन को सक्षम करने और ऐप्स को आंतरिक स्टोरेज या बाहरी एसडीकार्ड को पारदर्शी रूप से उपयोग करने की अनुमति देने के लिए किया गया था। FUSE का उपयोग कुछ ओवरहेड का परिचय देता है क्योंकि प्रत्येक यूजरस्पेस अनुरोध पथ का अनुसरण करता है: यूजरस्पेस → VFS → FUSE ड्राइवर → FUSE डेमॉन → VFS → ext4 → पेज कैश/स्टोरेज।

फ्यूज पासथ्रू फ्यूज

चित्र 2. FUSE उपयोक्तास्थान अनुरोध

FUSE पासथ्रू अनुरोध

अधिकांश फ़ाइल एक्सेस अनुमतियों की जाँच फ़ाइल के खुले समय पर की जाती है, अतिरिक्त अनुमतियों की जाँच उस फ़ाइल से पढ़ते और लिखते समय होती है। कुछ मामलों में, फ़ाइल खुलने के समय यह जानना संभव है कि अनुरोध करने वाले ऐप के पास अनुरोधित फ़ाइल तक पूर्ण पहुंच है, इसलिए सिस्टम को FUSE ड्राइवर से FUSE डेमॉन तक पढ़ने और लिखने के अनुरोधों को अग्रेषित करने की आवश्यकता नहीं है (जैसा कि) केवल डेटा को एक स्थान से दूसरे स्थान पर ले जाया जाएगा)।

FUSE पासथ्रू के साथ, एक खुले अनुरोध को संभालने वाला FUSE डेमॉन FUSE ड्राइवर को सूचित कर सकता है कि ऑपरेशन की अनुमति है और बाद के सभी पढ़ने और लिखने के अनुरोधों को सीधे निचले फ़ाइल सिस्टम पर भेजा जा सकता है। यह FUSE ड्राइवर अनुरोधों का उत्तर देने के लिए उपयोगकर्ता स्थान FUSE डेमॉन की प्रतीक्षा के अतिरिक्त ओवरहेड से बचता है।

FUSE और FUSE पासथ्रू अनुरोधों की तुलना नीचे दिखाई गई है।

फ्यूज पासथ्रू तुलना

चित्र 3. फ़्यूज़ अनुरोध बनाम फ़्यूज़ पासथ्रू अनुरोध

जब कोई ऐप FUSE फ़ाइल सिस्टम एक्सेस करता है, तो निम्नलिखित ऑपरेशन होते हैं:

  1. FUSE ड्राइवर अनुरोध को संभालता है और कतारबद्ध करता है, फिर इसे FUSE डेमॉन को प्रस्तुत करता है जो उस FUSE फ़ाइल सिस्टम को /dev/fuse फ़ाइल पर एक विशिष्ट कनेक्शन उदाहरण के माध्यम से संभालता है, जिसे FUSE डेमॉन को पढ़ने से अवरुद्ध किया जाता है।

  2. जब FUSE डेमॉन को किसी फ़ाइल को खोलने का अनुरोध प्राप्त होता है, तो यह निर्णय लेता है कि उस विशेष फ़ाइल के लिए FUSE पासथ्रू उपलब्ध होना चाहिए या नहीं। यदि यह उपलब्ध है, तो डेमॉन:

    1. इस अनुरोध के बारे में FUSE ड्राइवर को सूचित करता है।

    2. FUSE_DEV_IOC_PASSTHROUGH_OPEN ioctl का उपयोग करके फ़ाइल के लिए FUSE पासथ्रू सक्षम करता है, जिसे खोले गए /dev/fuse के फ़ाइल डिस्क्रिप्टर पर निष्पादित किया जाना चाहिए।

  3. ioctl एक डेटा संरचना प्राप्त करता है (एक पैरामीटर के रूप में) जिसमें निम्नलिखित शामिल हैं:

    • निचली फ़ाइल सिस्टम फ़ाइल का फ़ाइल डिस्क्रिप्टर जो पासथ्रू सुविधा का लक्ष्य है।

    • FUSE अनुरोध का विशिष्ट पहचानकर्ता जिसे वर्तमान में संभाला जा रहा है (खुला होना चाहिए या बनाना-और-खुला होना चाहिए)।

    • अतिरिक्त फ़ील्ड जिन्हें खाली छोड़ा जा सकता है और भविष्य के कार्यान्वयन के लिए हैं।

  4. यदि ioctl सफल होता है, तो FUSE डेमॉन खुले अनुरोध को पूरा करता है, FUSE ड्राइवर FUSE डेमॉन उत्तर को संभालता है, और निचली फ़ाइल सिस्टम फ़ाइल का संदर्भ कर्नेल के भीतर FUSE फ़ाइल में जोड़ा जाता है। जब कोई ऐप FUSE फ़ाइल पर पढ़ने/लिखने के ऑपरेशन का अनुरोध करता है, तो FUSE ड्राइवर जाँच करता है कि निचली फ़ाइल सिस्टम फ़ाइल का संदर्भ उपलब्ध है या नहीं।

    • यदि कोई संदर्भ उपलब्ध है, तो ड्राइवर निचली फ़ाइल सिस्टम फ़ाइल को लक्षित करने वाले समान मापदंडों के साथ एक नया वर्चुअल फ़ाइल सिस्टम (VFS) अनुरोध बनाता है।

    • यदि कोई संदर्भ उपलब्ध नहीं है, तो ड्राइवर FUSE डेमॉन को अनुरोध अग्रेषित करता है।

उपरोक्त ऑपरेशन सामान्य फ़ाइलों पर पढ़ने/लिखने और पढ़ने-इटर/राइट-इटर के लिए होते हैं और मेमोरी-मैप की गई फ़ाइलों पर पढ़ने/लिखने के संचालन के लिए होते हैं। किसी दी गई फ़ाइल के लिए FUSE पासथ्रू तब तक मौजूद रहता है जब तक वह फ़ाइल बंद न हो जाए।

FUSE पासथ्रू लागू करें

Android 12 चलाने वाले उपकरणों पर FUSE पासथ्रू को सक्षम करने के लिए, लक्ष्य डिवाइस की $ANDROID_BUILD_TOP/device/…/device.mk फ़ाइल में निम्नलिखित पंक्तियाँ जोड़ें।

# Use FUSE passthrough
PRODUCT_PRODUCT_PROPERTIES += \
    persist.sys.fuse.passthrough.enable=true

FUSE पासथ्रू को अक्षम करने के लिए, उपरोक्त कॉन्फ़िगरेशन परिवर्तन को छोड़ दें या persist.sys.fuse.passthrough.enable को false पर सेट करें। यदि आपने पहले FUSE पासथ्रू को सक्षम किया है, तो इसे अक्षम करने से डिवाइस FUSE पासथ्रू का उपयोग करने से रोकता है लेकिन डिवाइस कार्यशील रहता है।

डिवाइस को फ्लैश किए बिना FUSE पासथ्रू को सक्षम/अक्षम करने के लिए, ADB कमांड का उपयोग करके सिस्टम प्रॉपर्टी को बदलें। एक उदाहरण नीचे दिया गया है।

adb root
adb shell setprop persist.sys.fuse.passthrough.enable {true,false}
adb reboot

अतिरिक्त सहायता के लिए, संदर्भ कार्यान्वयन देखें।

FUSE पासथ्रू को मान्य करें

यह सत्यापित करने के लिए कि MediaProvider FUSE पासथ्रू का उपयोग कर रहा है, डिबगिंग संदेशों के लिए logcat जाँच करें। उदाहरण के लिए:

adb logcat FuseDaemon:V \*:S
--------- beginning of main
03-02 12:09:57.833  3499  3773 I FuseDaemon: Using FUSE passthrough
03-02 12:09:57.833  3499  3773 I FuseDaemon: Starting fuse...

FuseDaemon: Using FUSE passthrough यह सुनिश्चित करता है कि FUSE पासथ्रू उपयोग में है।

Android 12 CTS में CtsStorageTest शामिल है, जिसमें FUSE पासथ्रू को ट्रिगर करने वाले परीक्षण शामिल हैं। परीक्षण को मैन्युअल रूप से चलाने के लिए, नीचे दिखाए अनुसार atest का उपयोग करें:

atest CtsStorageTest