Android 12 में FUSE पासथ्रू की सुविधा काम करती है. इससे FUSE ओवरहेड कम हो जाता है, ताकि फ़ाइल सिस्टम के निचले हिस्से को सीधे तौर पर ऐक्सेस करने की तुलना में बेहतर परफ़ॉर्मेंस मिल सके. FUSE पासथ्रू की सुविधा, android12-5.4
, android12-5.10
, और android-mainline
(सिर्फ़ टेस्टिंग के लिए) कर्नल में काम करती है. इसका मतलब है कि इस सुविधा के लिए, डिवाइस में इस्तेमाल किए गए कर्नल और डिवाइस में चल रहे Android के वर्शन पर निर्भर करता है:
Android 11 से Android 12 पर अपग्रेड करने वाले डिवाइसों पर, FUSE पासथ्रू की सुविधा काम नहीं करेगी. ऐसा इसलिए, क्योंकि इन डिवाइसों के कर्नल फ़्रीज़ कर दिए गए हैं. साथ ही, इन्हें ऐसे कर्नल पर नहीं ले जाया जा सकता जिसे FUSE पासथ्रू की सुविधा के साथ आधिकारिक तौर पर अपग्रेड किया गया हो.
Android 12 के साथ लॉन्च होने वाले डिवाइसों में, आधिकारिक कर्नेल का इस्तेमाल करते समय FUSE पासथ्रू की सुविधा काम कर सकती है. ऐसे डिवाइसों के लिए, FUSE पासथ्रू को लागू करने वाला Android फ़्रेमवर्क कोड, MediaProvider मेनलाइन मॉड्यूल में एम्बेड किया जाता है. यह अपने-आप अपग्रेड हो जाता है. जिन डिवाइसों में MediaProvider को मेनलाइन मॉड्यूल के तौर पर लागू नहीं किया जाता (उदाहरण के लिए, Android Go डिवाइस), वे भी MediaProvider में हुए बदलावों को ऐक्सेस कर सकते हैं. ऐसा इसलिए, क्योंकि इन्हें सार्वजनिक तौर पर शेयर किया जाता है.
FUSE बनाम SDCardFS
File system in Userspace (FUSE) एक ऐसा तरीका है जिसकी मदद से, FUSE फ़ाइल सिस्टम पर की जाने वाली कार्रवाइयों को कर्नेल (FUSE ड्राइवर) से यूज़रस्पेस प्रोग्राम (FUSE डेमॉन) को आउटसोर्स किया जा सकता है. यह प्रोग्राम, कार्रवाइयों को लागू करता है. Android 11 ने SDCardFS को बंद कर दिया है और स्टोरेज इम्यूलेशन के लिए, FUSE को डिफ़ॉल्ट समाधान बना दिया है. इस बदलाव के तहत, Android ने फ़ाइल ऐक्सेस को इंटरसेप्ट करने, सुरक्षा और निजता से जुड़ी अतिरिक्त सुविधाओं को लागू करने, और रनटाइम पर फ़ाइलों में बदलाव करने के लिए, अपने FUSE डेमॉन को लागू किया.
FUSE, कैश मेमोरी में सेव की जा सकने वाली जानकारी (जैसे कि पेज या एट्रिब्यूट) को मैनेज करने में अच्छा काम करता है. हालांकि, बाहरी स्टोरेज को ऐक्सेस करने पर, परफ़ॉर्मेंस में गिरावट आती है. यह गिरावट, खास तौर पर मिड और लो-एंड डिवाइसों में दिखती है. ये रिग्रेशन, FUSE फ़ाइल सिस्टम को लागू करने में एक साथ काम करने वाले कॉम्पोनेंट की वजह से होते हैं. साथ ही, FUSE ड्राइवर और FUSE डेमॉन के बीच कम्यूनिकेशन में, कर्नल स्पेस से यूज़र स्पेस में कई स्विच की वजह से भी होते हैं. ऐसा, लोअर फ़ाइल सिस्टम के डायरेक्ट ऐक्सेस की तुलना में होता है. लोअर फ़ाइल सिस्टम, कर्नल में पूरी तरह से लागू होता है और यह कम जगह लेता है.
इन रिग्रेशन को कम करने के लिए, ऐप्लिकेशन स्प्लाइसिंग का इस्तेमाल कर सकते हैं. इससे डेटा कॉपी करने की प्रोसेस कम हो जाती है. साथ ही, फ़ाइल सिस्टम की छोटी फ़ाइलों को सीधे ऐक्सेस करने के लिए, ContentProvider API का इस्तेमाल किया जा सकता है. इन और अन्य ऑप्टिमाइज़ेशन के बावजूद, FUSE का इस्तेमाल करते समय पढ़ने और लिखने की कार्रवाइयों के लिए बैंडविथ कम हो सकता है. ऐसा तब होता है, जब फ़ाइल सिस्टम के निचले स्तर पर सीधे तौर पर ऐक्सेस करने की तुलना में FUSE का इस्तेमाल किया जाता है. खास तौर पर, रैंडम रीड ऑपरेशन के दौरान ऐसा होता है, जहां कोई भी कैश मेमोरी या रीड-अहेड मदद नहीं कर सकता. साथ ही, जो ऐप्लिकेशन लेगसी /sdcard/
पाथ के ज़रिए सीधे तौर पर स्टोरेज ऐक्सेस करते हैं उनकी परफ़ॉर्मेंस में काफ़ी गिरावट आती है. खास तौर पर, जब वे ज़्यादा इनपुट/आउटपुट वाले ऑपरेशन करते हैं.
SDcardFS userspace के अनुरोध
SDcardFS का इस्तेमाल करने से, FUSE के स्टोरेज इम्यूलेशन और अनुमति की जांच की प्रोसेस को तेज़ किया जा सकता है. इसके लिए, कर्नल से उपयोगकर्ता स्पेस कॉल को हटाना होगा. उपयोगकर्ता स्पेस के अनुरोध इस पाथ को फ़ॉलो करते हैं: Userspace → VFS → sdcardfs → VFS → ext4 → पेज कैश/स्टोरेज.
पहली इमेज. SDcardFS userspace के अनुरोध
FUSE userspace अनुरोध
शुरुआत में, FUSE का इस्तेमाल स्टोरेज इम्यूलेशन को चालू करने के लिए किया जाता था. साथ ही, यह ऐप्लिकेशन को डिवाइस के स्टोरेज या बाहरी एसडीकार्ड का इस्तेमाल करने की अनुमति देता था. FUSE का इस्तेमाल करने पर, कुछ ओवरहेड होता है. ऐसा इसलिए, क्योंकि उपयोगकर्ता स्पेस से किए गए हर अनुरोध के लिए, इस पाथ को फ़ॉलो किया जाता है: उपयोगकर्ता स्पेस → वीएफ़एस → FUSE ड्राइवर → FUSE डेमॉन → वीएफ़एस → ext4 → पेज कैश/स्टोरेज.
दूसरी इमेज. FUSE userspace अनुरोध
FUSE पासथ्रू अनुरोध
फ़ाइल ऐक्सेस करने की ज़्यादातर अनुमतियों की जांच, फ़ाइल खोलने के समय की जाती है. इसके अलावा, फ़ाइल से डेटा पढ़ने और उसमें डेटा लिखने के दौरान भी अनुमतियों की जांच की जाती है. कुछ मामलों में, फ़ाइल खोलने के समय यह पता चल सकता है कि अनुरोध करने वाले ऐप्लिकेशन के पास, अनुरोध की गई फ़ाइल का पूरा ऐक्सेस है. इसलिए, सिस्टम को FUSE ड्राइवर से FUSE डेमॉन को पढ़ने और लिखने के अनुरोधों को फ़ॉरवर्ड करने की ज़रूरत नहीं होती. ऐसा इसलिए, क्योंकि इससे सिर्फ़ डेटा को एक जगह से दूसरी जगह ले जाया जा सकेगा.
FUSE पासथ्रू की मदद से, खुले अनुरोध को हैंडल करने वाला FUSE डीमन, FUSE ड्राइवर को सूचना दे सकता है कि ऑपरेशन की अनुमति है. साथ ही, बाद के सभी पढ़ने और लिखने के अनुरोधों को सीधे तौर पर निचले फ़ाइल सिस्टम पर फ़ॉरवर्ड किया जा सकता है. इससे, उपयोगकर्ता स्पेस FUSE डेमॉन को FUSE ड्राइवर के अनुरोधों का जवाब देने के लिए इंतज़ार करने की अतिरिक्त परेशानी से बचा जा सकता है.
यहां FUSE और FUSE पासथ्रू अनुरोधों की तुलना दिखाई गई है.
तीसरी इमेज. FUSE अनुरोध बनाम FUSE पासथ्रू अनुरोध
जब कोई ऐप्लिकेशन, FUSE फ़ाइल सिस्टम को ऐक्सेस करता है, तब ये कार्रवाइयां होती हैं:
FUSE ड्राइवर, अनुरोध को मैनेज करता है और उसे लाइन में लगाता है. इसके बाद, उसे FUSE डेमॉन को भेजता है. यह डेमॉन,
/dev/fuse
फ़ाइल पर किसी खास कनेक्शन इंस्टेंस के ज़रिए, FUSE फ़ाइल सिस्टम को मैनेज करता है. FUSE डेमॉन को इस फ़ाइल को पढ़ने से रोका जाता है.जब FUSE डेमॉन को कोई फ़ाइल खोलने का अनुरोध मिलता है, तो वह यह तय करता है कि उस फ़ाइल के लिए FUSE पासथ्रू उपलब्ध होना चाहिए या नहीं. अगर यह सुविधा उपलब्ध है, तो डीमन:
यह अनुरोध के बारे में FUSE ड्राइवर को सूचना देता है.
यह विकल्प, फ़ाइल के लिए FUSE पासथ्रू को चालू करता है. इसके लिए,
FUSE_DEV_IOC_PASSTHROUGH_OPEN
ioctl का इस्तेमाल किया जाता है. इसे खोले गए/dev/fuse
के फ़ाइल डिस्क्रिप्टर पर लागू करना ज़रूरी है.
ioctl को पैरामीटर के तौर पर एक डेटा स्ट्रक्चर मिलता है. इसमें यह जानकारी शामिल होती है:
यह लोअर फ़ाइल सिस्टम की उस फ़ाइल का फ़ाइल डिस्क्रिप्टर है जिसे पासथ्रू सुविधा के लिए टारगेट किया गया है.
FUSE अनुरोध का यूनीक आइडेंटिफ़ायर, जिसे फ़िलहाल हैंडल किया जा रहा है. यह अनुरोध, open या create-and-open होना चाहिए.
ऐसे अतिरिक्त फ़ील्ड जिन्हें खाली छोड़ा जा सकता है और जिनका इस्तेमाल आने वाले समय में किया जाएगा.
ioctl के पूरा होने पर, FUSE डेमॉन, फ़ाइल खोलने का अनुरोध पूरा करता है. इसके बाद, FUSE ड्राइवर, FUSE डेमॉन के जवाब को हैंडल करता है. साथ ही, कर्नल में मौजूद FUSE फ़ाइल में, लोअर फ़ाइल सिस्टम फ़ाइल का रेफ़रंस जोड़ दिया जाता है. जब कोई ऐप्लिकेशन, FUSE फ़ाइल पर पढ़ने/लिखने का अनुरोध करता है, तो FUSE ड्राइवर यह जांच करता है कि लोअर फ़ाइल सिस्टम फ़ाइल का रेफ़रंस उपलब्ध है या नहीं.
अगर कोई रेफ़रंस उपलब्ध है, तो ड्राइवर एक नया वर्चुअल फ़ाइल सिस्टम (वीएफ़एस) अनुरोध बनाता है. इसमें वही पैरामीटर होते हैं जो लोअर फ़ाइल सिस्टम फ़ाइल को टारगेट करते हैं.
अगर रेफ़रंस उपलब्ध नहीं है, तो ड्राइवर अनुरोध को 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 passthrough का इस्तेमाल कर रहा है, डीबग करने से जुड़े मैसेज के लिए 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