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