تفرض مساحة التخزين النطاق حدودًا على وصول التطبيقات إلى وحدة التخزين الخارجية. في الإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث، يجب أن تستخدم التطبيقات التي تستهدف المستوى 30 أو أعلى لواجهة برمجة التطبيقات مساحة التخزين ذات النطاق المحدّد. في الإصدار السابق من Android 10، كان بإمكان التطبيقات إيقاف ميزة "مساحة التخزين ذات النطاق المحدّد".
قيود الوصول إلى التطبيقات
يهدف نطاق التخزين إلى حماية خصوصية بيانات المستخدم والتطبيقات. ويشمل ذلك حماية معلومات المستخدم (مثل البيانات الوصفية للصور) ومنع التطبيقات من تعديل ملفات المستخدم أو حذفها بدون إذن صريح، وحماية مستندات المستخدم الحساسة التي تم تنزيلها إلى مجلّد "عمليات التنزيل" أو مجلّدات أخرى.
يمكن للتطبيقات التي تستخدم مساحة التخزين ذات النطاق المحدّد الحصول على مستويات الوصول التالية (يعتمد الوصول الفعلي على التنفيذ).
- إذن الوصول للقراءة والكتابة إلى ملفاتها بدون أذونات
- قراءة إذن الوصول إلى ملفات الوسائط في التطبيقات الأخرى باستخدام إذن
READ_EXTERNAL_STORAGE
- لا يُسمح بالوصول للكتابة في ملفات الوسائط الخاصة بالتطبيقات الأخرى إلا بعد الحصول على موافقة مباشرة من المستخدم (يتم منح استثناءات لـ "معرض الصور" في النظام والتطبيقات المؤهَّلة للوصول إلى كل الملفات).
- عدم السماح بالوصول إلى أدلة بيانات التطبيقات الخارجية للتطبيقات الأخرى من خلال القراءة أو الكتابة
استخدام ميزة "التخزين المحدود النطاق" مع FUSE
يتيح الإصدار Android 11 أو الإصدارات الأحدث استخدام واجهة Filesystem in Userspace (FUSE)، ما يتيح لوحدة MediaProvider فحص عمليات الملفات في مساحة المستخدِم وفرض قيود على الوصول إلى الملفات استنادًا إلى سياسة السماح أو الرفض أو التعديل. تحصل التطبيقات التي تستخدم واجهة برمجة التطبيقات FUSE في مساحة التخزين المحدود على ميزات ملف الخصوصية في مساحة التخزين المحدود والقدرة على الوصول إلى الملفات باستخدام ملف مسار مباشر (مع إبقاء واجهات برمجة التطبيقات File APIs تعمل في التطبيقات).
فرض نظام التشغيل Android 10 قواعد مساحة التخزين ذات النطاق المحدّد على عمليات الوصول إلى الملفات التي يجريها MediaProvider، ولكن ليس على الوصول المباشر إلى مسار الملف (على سبيل المثال، باستخدام File API وواجهات برمجة التطبيقات NDK) بسبب الجهد المطلوب في اعتراض طلبات الوصول إلى النواة. ونتيجةً لذلك، لم تتمكّن التطبيقات في مساحة التخزين المحدود النطاق من الوصول إلى الملفات باستخدام مسار ملف مباشر. وقد أثّر هذا الحظر في قدرة مطوّري التطبيقات على التكيّف، حيث كان يتطلب إجراء تغييرات جوهرية في الرمز لإعادة كتابة إذن الوصول إلى واجهة برمجة تطبيقات File API إلى واجهة برمجة التطبيقات MediaProvider.
FUSE وSDCardFS
لا يرتبط توافق Android 11 مع FUSE بإيقاف استخدام SDCardFS نهائيًا، ولكنه يقدّم بديلاً لمتجر الوسائط للأجهزة التي كانت تستخدم SDCardFS في السابق. الأجهزة:
- لا يمكن استخدام kernel 5.4 أو إصدار أحدث لإطلاق التطبيق على نظام التشغيل Android 11 أو إصدار أحدث.
- عند الترقية إلى الإصدار Android 11 أو الإصدارات الأحدث، يمكن استضافة FUSE في أعلى SDCardCardFS لاعتراض عمليات الملفات وتحقيق أهداف الخصوصية.
تحسين أداء FUSE
كان نظام التشغيل Android متوافقًا سابقًا مع FUSE في الإصدار 7 أو الإصدارات الأقدم، حيث كان يتم تثبيت مساحة التخزين الخارجية كـ FUSE. بسبب مشاكل الأداء والتوقف المفاجئ في التنفيذ المتعلّق بواجهة FUSE، طرح نظام التشغيل Android 8 واجهة SDCardFS. يعيد نظام التشغيل Android
11 إتاحة استخدام FUSE باستخدام عملية تنفيذ محسّنة
وأكثر اختبارًا من libfuse
يمكن ضبطها لحلّ
مشاكل الأداء في Android 7 أو الإصدارات الأقدم.
تشمل عملية ضبط FUSE التعديلات التالية:
- تخطّي FUSE للأدلّة
Android/data
وAndroid/obb
لتحسين أداء تطبيقات الألعاب التي تعتمد على هذين الدليلَين - التحسينات (مثل ضبط نسبة القراءة المسبقة ونسبة الملفات غير المحفوظة في ذاكرة التخزين المؤقت لنظام الملفات FUSE ) للحفاظ على أداء القراءة وتشغيل الوسائط بسلاسة
- استخدام ذاكرة التخزين المؤقت للكتابة في FUSE
- أذونات التخزين المؤقت لتقليل عمليات تبادل البيانات بين العمليات (IPC) مع خادم النظام
- تحسينات للتطبيقات التي يمكنها الوصول إلى كل الملفات لزيادة سرعة العمليات المجمّعة.
يمكن أن تؤدي تعديلات الضبط المذكورة أعلاه إلى تحقيق أداء مماثل بين أجهزة FUSE و الأجهزة غير المزوّدة بتقنية FUSE. على سبيل المثال، أظهر اختبار هاتف Pixel 2 الذي تم ضبطه باستخدام FUSE وهاتف Pixel 2 الذي تم ضبطه باستخدام "متجر الوسائط" أداءً متشابهًا في القراءة التسلسلية (مثل تشغيل الفيديو) بين الوصول إلى مسار الملف و"متجر الوسائط". ومع ذلك، كانت عمليات الكتابة المتسلسلة أسوأ قليلاً باستخدام FUSE، ويمكن أن تكون عمليات القراءة والكتابة العشوائية أبطأ مرتين بحد أقصى.
يمكن أن تتغير قياسات الأداء من جهاز إلى آخر وبين حالات استخدام معينة. ولأنّ واجهات برمجة تطبيقات MediaProvider توفّر الأداء الأكثر اتساقًا، يجب أن يستخدم مطوِّرو التطبيقات المهتمّون بالأداء واجهات برمجة تطبيقات MediaProvider في تطبيقاتهم.
الحدّ من تأثير أداء FUSE
يقتصر تأثير أداء FUSE على المستخدمين المكثّفين للملفات المخزّنة على مساحة تخزين خارجية
مشترَكة فقط. يتجاوز FUSE مساحة التخزين الخاصة الخارجية (التي تتضمّن الدليلَين android/data
وandroid/obb
)، في حين لا يتم تثبيت FUSE على مساحة التخزين الداخلية (مثل /data/data
، حيث تخزِّن العديد من التطبيقات البيانات للحفاظ على تشفيرها وأمانها).
إنّ التطبيقات التي تستخدم مساحة تخزين خارجية مشترَكة بشكل بسيط غالبًا ما تتفاعل مع مجموعة محدودة من الملفات (عادةً ما تكون أقل من 100 ملف). تستفيد هذه التطبيقات من التحسينات الحالية لعمليات القراءة والكتابة الشائعة ولن تشهد أي تأثير في الأداء ذي صلة بـ FUSE في Android 11.
إنّ التطبيقات التي تستخدم مساحة التخزين الخارجية المشتركة بشكل كبير تُجري عادةً عمليات متعلقة بالملفّات بشكلٍ مجمّع، مثل إدراج أو إزالة دليل يتضمّن 1,000 ملفّ، أو إنشاء أو حذف دليل يتضمّن مليون ملفّ على نظام الملفّات. قد تتأثر عمليات معالجة الملفات المجمّعة بواجهة برمجة التطبيقات FUSE على نظام التشغيل Android 11، ولكن إذا كانت هذه التطبيقات مؤهلة للحصول على إذن
MANAGE_EXTERNAL_STORAGE
، ستستفيد من تحسينات الأداء المضمّنة في تحديث تشرين الأول (أكتوبر) 2020.
لتجنُّب زيادة الأداء في FUSE، يمكن للتطبيقات تخزين البيانات في ملف تخزين شخصي خارجي
أو استخدام واجهات برمجة التطبيقات المجمّعة في فئة ContentProvider
لتجاوز FUSE والحصول على مسار
محسَّن للأداء. بالإضافة إلى ذلك، يتضمّن تحديث تشرين الأول (أكتوبر) 2020 لمكوّن النظام
MediaProvider تحسينات في الأداء لمدراءملفه
والتطبيقات المشابهة (مثل تطبيقات الاحتفاظ بنسخة احتياطية/استعادتها ومكافحة الفيروسات) التي تمتلك إذن
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 اعتراض طلبات kernel وضمان الحفاظ على خصوصية عمليات الملفات.
في الإصدار 11 من Android والإصدارات الأحدث، يُعدّ MediaProvider أيضًا مكوّنًا نموذجيًا للنظام (وحدة Mainline) يمكن تحديثها خارج إصدارات Android. وهذا يعني أنّه يمكن حلّ المشاكل المتعلّقة بالأداء أو الخصوصية أو الأمان في MediaProvider وإرسالها عبر الإنترنت من خلال Google Play Store أو من خلال غيرها من آليات التي يوفّرها الشركاء. يمكن أيضًا تعديل أيّ شيء ضمن نطاق ما هو متوقّع من معالج FUSE، ما يتيح إجراء تعديلات لإصلاح الأداء المنخفض وحلّ الأخطاء في FUSE.