تحد ميزة "التخزين الفرعي" من وصول التطبيق إلى مساحة التخزين الخارجية. في الإصدار 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 API.
FUSE وSDCardFS
لا يرتبط توافق Android 11 مع FUSE بإيقاف استخدام SDCardFS نهائيًا، ولكنه يقدّم بديلاً لمتجر الوسائط للأجهزة التي كانت تستخدم SDCardFS في السابق. الأجهزة:
- لا يمكن استخدام SDCardFS عند التشغيل باستخدام نظام التشغيل Android 11 أو إصدار أحدث باستخدام الإصدار 5.4 من kernel أو إصدار أحدث.
- يمكن أن يؤدي الترقية إلى Android 11 أو إصدار أحدث إلى استضافة FUSE على قمة SDCardFS لمنع عمليات الملفات وتحقيق أهداف الخصوصية.
تحسين أداء 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 API توفّر أفضل أداء متّسق، على مطوّري التطبيقات الذين يهتمون بالأداء استخدام واجهات برمجة التطبيقات MediaProvider API لتطبيقاتهم.
الحدّ من تأثير 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.
في الإصدار 10 من Android والإصدارات الأقدم، كان نظام الملفات هو SDCardFS، ويوفّر MediaProvider واجهة لمجموعات الملفات (مثل الصور والفيديوهات وملفات الموسيقى وما إلى ذلك). عندما ينشئ تطبيق ملفًا باستخدام File API، يمكنه أن يطلب من MediaProvider فحص الملف وسجله في قاعدة البيانات.
في Android 11 أو الإصدارات الأحدث، تم إيقافSDCardFS نهائيًا وأصبح MediaProvider معالِج نظام الملفات (لبروتوكول FUSE) لوحدة التخزين الخارجية، ما يؤدي إلى اتساق نظام الملفات في وحدة التخزين الخارجية وقاعدة بيانات MediaProvider. بصفتها معالِج مساحة المستخدم لنظام ملفات FUSE، يمكن لواجهة MediaProvider اعتراض طلبات تشغيل نظام التشغيل والتأكّد من أنّ عمليات الملفات آمنة من حيث الخصوصية.
في الإصدار 11 من Android والإصدارات الأحدث، يُعدّ MediaProvider أيضًا مكوّن نظام نموذجيًا (وحدة Mainline) يمكن تحديثها خارج إصدارات Android. وهذا يعني أنّه يمكن حلّ المشاكل المتعلّقة بالأداء أو الخصوصية أو الأمان في MediaProvider وإرسالها عبر الإنترنت من خلال Google Play Store أو من خلال غيرها من آليات التي يوفّرها الشركاء. يمكن أيضًا تعديل أيّ شيء ضمن نطاق ما هو متوقّع من معالج FUSE، ما يتيح إجراء تحديثات لإصلاح الأداء المنخفض لـ FUSE والأخطاء.