تقنية مرور الإشارة في FUSE

يتيح Android 12 ميزة عرض فيديو خارجي في FUSE، ما يقلّل من النفقات العامة في FUSE لتحقيق أداء مماثل للأداء عند الوصول المباشر إلى نظام الملفات الأدنى. تتوفّر ميزة عرض فيديو خارجي في FUSE في النواة android12-5.4 وandroid12-5.10 وandroid-mainline (للاختبار فقط)، ما يعني أنّ توفّر هذه الميزة يعتمد على النواة التي يستخدمها الجهاز وإصدار Android الذي يعمل به الجهاز:

  • لا يمكن للأجهزة التي تتم ترقيتها من Android 11 إلى Android 12 أن تتيح ميزة عرض فيديو خارجي في FUSE لأنّ نواة هذه الأجهزة ثابتة ولا يمكنها الانتقال إلى نواة تمّت ترقيتها رسميًا باستخدام تغييرات ميزة عرض فيديو خارجي في FUSE.

  • يمكن للأجهزة التي يتم إطلاقها باستخدام Android 12 أن تتيح ميزة عرض فيديو خارجي في FUSE عند استخدام نواة رسمية. بالنسبة إلى هذه الأجهزة، يتم تضمين رمز إطار عمل Android الذي يتيح ميزة عرض فيديو خارجي في FUSE في وحدة MediaProvider الرئيسية التي تتم ترقيتها تلقائيًا. يمكن للأجهزة التي لا تستخدِم MediaProvider كوحدة رئيسية (مثل أجهزة Android Go) أن تصل أيضًا إلى تغييرات MediaProvider لأنّها تتم مشاركتها علنًا.

مقارنة بين FUSE وSDCardFS

نظام الملفات في مساحة المستخدم (FUSE) هو آلية تسمح للنواة (برنامج تشغيل FUSE) بالاستعانة بمصادر خارجية لتنفيذ العمليات التي يتم إجراؤها على نظام ملفات FUSE، وذلك من خلال برنامج مساحة المستخدم (برنامج FUSE الخفي) الذي ينفّذ العمليات. أوقف Android 11 استخدام SDCardFS وأصبح FUSE هو الحلّ التلقائي لمحاكاة مساحة التخزين. كجزء من هذا التغيير، نفّذ Android برنامجًا خفيًا خاصًا به في FUSE لاعتراض عمليات الوصول إلى الملفات، وفرض ميزات أمان وخصوصية إضافية، ومعالجة الملفات في وقت التشغيل.

على الرغم من أنّ FUSE يعمل بشكل جيد عند التعامل مع المعلومات القابلة للتخزين المؤقت، مثل الصفحات أو السمات، فإنّه يؤدي إلى تراجع الأداء عند الوصول إلى مساحة التخزين الخارجية، ويظهر ذلك بشكل خاص في الأجهزة المتوسّطة والمنخفضة المستوى. يرجع هذا التراجع إلى سلسلة من المكوّنات التي تتعاون في تنفيذ نظام ملفات FUSE، بالإضافة إلى عمليات التبديل المتعدّدة من مساحة النواة إلى مساحة المستخدم في الاتصالات بين برنامج تشغيل FUSE والبرنامج الخفي في FUSE (مقارنةً بالوصول المباشر إلى نظام الملفات الأدنى الذي يكون أكثر بساطة ويتم تنفيذه بالكامل في النواة).

للتخفيف من هذا التراجع، يمكن للتطبيقات استخدام الربط لـ تقليل نسخ البيانات واستخدام واجهة برمجة التطبيقات ContentProvider للوصول مباشرةً إلى ملفات نظام الملفات الأدنى. حتى مع هذه والتحسينات الأخرى، قد تشهد عمليات القراءة والكتابة نطاقًا تردديًا أقل عند استخدام FUSE مقارنةً بالوصول المباشر إلى نظام الملفات الأدنى — خاصةً مع عمليات القراءة العشوائية ، حيث لا يمكن أن يساعد التخزين المؤقت أو القراءة المسبقة. وتستمر التطبيقات التي تصل مباشرةً إلى مساحة التخزين من خلال المسار القديم /sdcard/ في مواجهة انخفاضات ملحوظة في الأداء، خاصةً عند إجراء عمليات كثيفة الإدخال والإخراج.

طلبات مساحة المستخدم في SDcardFS

يمكن أن يؤدي استخدام SDcardFS إلى تسريع محاكاة مساحة التخزين وعمليات التحقّق من الأذونات في FUSE عن طريق إزالة طلب مساحة المستخدم من النواة. تتّبع طلبات مساحة المستخدم المسار التالي: مساحة المستخدم ← نظام الملفات الظاهري ← sdcardfs ← نظام الملفات الظاهري ← ext4 ← ذاكرة التخزين المؤقت للصفحة/مساحة التخزين.

FUSE Passthrough SDcardFS

الشكل 1: طلبات مساحة المستخدم في SDcardFS

طلبات مساحة المستخدم في FUSE

تم استخدام FUSE في البداية لتفعيل محاكاة مساحة التخزين والسماح للتطبيقات باستخدام مساحة التخزين الداخلية أو بطاقة SD خارجية بشكل شفاف. يؤدي استخدام FUSE إلى بعض النفقات العامة لأنّ كل طلب في مساحة المستخدم يتّبع المسار التالي: مساحة المستخدم ← نظام الملفات الظاهري ← برنامج تشغيل FUSE ← البرنامج الخفي في FUSE ← نظام الملفات الظاهري ← ext4 ← ذاكرة التخزين المؤقت للصفحة/مساحة التخزين.

FUSE Passthrough FUSE

الشكل 2: طلبات مساحة المستخدم في FUSE

طلبات عرض فيديو خارجي في FUSE

يتم التحقّق من معظم أذونات الوصول إلى الملفات عند فتح الملف، مع إجراء عمليات تحقّق إضافية من الأذونات عند القراءة من هذا الملف والكتابة فيه. في بعض الحالات، من الممكن معرفة ما إذا كان التطبيق الذي يطلب الملف لديه إذن الوصول الكامل إلى الملف المطلوب عند فتح الملف، لذا لا يحتاج النظام إلى مواصلة إعادة توجيه طلبات القراءة والكتابة من برنامج تشغيل FUSE إلى البرنامج الخفي في FUSE (لأنّ ذلك سيؤدي فقط إلى نقل البيانات من مكان إلى آخر).

باستخدام ميزة عرض فيديو خارجي في FUSE، يمكن للبرنامج الخفي في FUSE الذي يعالج طلبًا مفتوحًا إبلاغ برنامج تشغيل FUSE بأنّ العملية مسموح بها وأنّه يمكن إعادة توجيه جميع طلبات القراءة والكتابة اللاحقة مباشرةً إلى نظام الملفات الأدنى. يؤدي ذلك إلى تجنُّب النفقات العامة الإضافية الناتجة عن انتظار ردّ البرنامج الخفي في FUSE في مساحة المستخدم على طلبات برنامج تشغيل FUSE.

في ما يلي مقارنة بين طلبات FUSE وطلبات عرض فيديو خارجي في FUSE.

مقارنة أداء FUSE Passthrough

الشكل 3: مقارنة بين طلب FUSE وطلب عرض فيديو خارجي في FUSE

عندما يصل تطبيق إلى نظام ملفات FUSE، تحدث العمليات التالية:

  1. يعالج برنامج تشغيل FUSE الطلب ويضعه في قائمة الانتظار، ثم يعرضه على البرنامج الخفي في FUSE الذي يعالج نظام ملفات FUSE هذا من خلال مثال اتصال محدّد على الملف /dev/fuse، الذي يتم منع البرنامج الخفي في FUSE من قراءته.

  2. عندما يتلقّى البرنامج الخفي في FUSE طلبًا بفتح ملف، يقرّر ما إذا كان يجب أن تتوفّر ميزة عرض فيديو خارجي في FUSE لهذا الملف تحديدًا. إذا كانت هذه الميزة متوفّرة، فإنّ البرنامج الخفي:

    1. يُعلم برنامج تشغيل FUSE بهذا الطلب.

    2. يُفعِّل ميزة عرض فيديو خارجي في FUSE للملف باستخدام `ioctl`‏ FUSE_DEV_IOC_PASSTHROUGH_OPEN، التي يجب تنفيذها على واصف الملف الخاص بالملف /dev/fuse الذي تم فتحه.

  3. يتلقّى `ioctl` (كمَعلمة) بنية بيانات تحتوي على ما يلي:

    • واصف ملف نظام الملفات الأدنى الذي يمثّل هدف ميزة عرض فيديو خارجي.

    • المعرّف الفريد لطلب FUSE الذي تتم معالجته حاليًا (يجب أن يكون مفتوحًا أو إنشاء وفتح).

    • حقول إضافية يمكن تركها فارغة وهي مخصّصة للتنفيذات المستقبلية.

  4. إذا نجحت `ioctl`، يُكمل البرنامج الخفي في FUSE طلب الفتح، ويعالج برنامج تشغيل FUSE ردّ البرنامج الخفي في FUSE، وتتم إضافة مرجع إلى ملف نظام الملفات الأدنى إلى ملف FUSE داخل النواة. عندما يطلب تطبيق عملية قراءة/كتابة على ملف FUSE، يتحقّق برنامج تشغيل FUSE مما إذا كان المرجع إلى ملف نظام الملفات الأدنى متوفّرًا.

    • إذا كان المرجع متوفّرًا، ينشئ برنامج التشغيل طلبًا جديدًا لنظام الملفات الظاهري (VFS) بالمعلّمات نفسها التي تستهدف ملف نظام الملفات الأدنى.

    • إذا لم يكن المرجع متوفّرًا، يعيد برنامج التشغيل توجيه الطلب إلى البرنامج الخفي في FUSE.

تحدث العمليات أعلاه للقراءة/الكتابة والقراءة المتكرّرة/الكتابة المتكرّرة على الملفات العامة وعمليات القراءة/الكتابة على الملفات التي تم ربطها بالذاكرة. تتوفّر ميزة عرض فيديو خارجي في FUSE لملف معيّن إلى أن يتم إغلاق هذا الملف.

تنفيذ ميزة عرض فيديو خارجي في FUSE

لتفعيل ميزة تقنية مرور الإشارة في FUSE على الأجهزة التي تعمل بنظام التشغيل Android 12، أضِف الأسطر التالية إلى الملف $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 أو إيقافها بدون نقل صورة النظام إلى الجهاز، غيِّر خاصية النظام باستخدام أوامر 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 قيد الاستخدام.

تتضمّن مجموعة اختبار التوافق (CTS) في Android 12 الاختبار CtsStorageTest، الذي يتضمّن اختبارات تؤدي إلى تفعيل ميزة عرض فيديو خارجي في FUSE. لتشغيل الاختبار يدويًا، استخدِم atest كما هو موضّح أدناه:

atest CtsStorageTest