مساحة التخزين المحدود النطاق

تحدّ ميزة "التخزين المحصور النطاق" من إمكانية وصول التطبيقات إلى مساحة التخزين الخارجية. في الإصدار 11 من نظام التشغيل Android أو الإصدارات الأحدث، يجب أن تستخدم التطبيقات التي تستهدف المستوى 30 لواجهة برمجة التطبيقات أو المستويات الأحدث ميزة "التخزين المحصور". في الإصدار 10 من نظام التشغيل Android، كان بإمكان التطبيقات إيقاف ميزة "مساحة التخزين المحصورة".

قيود الوصول إلى التطبيقات

تهدف ميزة "التخزين المحصور النطاق" إلى حماية خصوصية بيانات التطبيقات والمستخدمين. ويشمل ذلك حماية معلومات المستخدمين (مثل البيانات الوصفية للصور)، ومنع التطبيقات من تعديل ملفات المستخدمين أو حذفها بدون إذن صريح، وحماية مستندات المستخدمين الحساسة التي يتم تنزيلها إلى مجلد "التنزيلات" أو مجلدات أخرى.

يمكن أن يكون للتطبيقات التي تستخدم مساحة التخزين المحصورة مستويات الوصول التالية (يختلف الوصول الفعلي حسب التنفيذ).

  • إذن القراءة والكتابة للملفات الخاصة بها بدون أذونات
  • إذن READ_EXTERNAL_STORAGE بالوصول للقراءة إلى ملفات الوسائط الخاصة بالتطبيقات الأخرى
  • لا يُسمح بتوفير إذن الكتابة للوصول إلى ملفات الوسائط الخاصة بالتطبيقات الأخرى إلا بموافقة مباشرة من المستخدم (يُستثنى من ذلك "معرض النظام" والتطبيقات المؤهَّلة للحصول على إذن "الوصول إلى كل الملفات").
  • لا يمكن القراءة أو الكتابة في أدلة بيانات التطبيقات الخارجية الخاصة بالتطبيقات الأخرى

استخدام ميزة "التخزين النطاقي" مع نظام الملفات في مساحة المستخدم (FUSE)

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

فرض نظام التشغيل 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 يمكن ضبطه لحل مشاكل الأداء في نظام التشغيل Android 7 أو الإصدارات الأقدم.

يتضمّن ضبط 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 على المستخدمين الذين يستخدمون الملفات المخزّنة على وحدة تخزين مشترَكة خارجية بشكل مكثّف فقط. يتجاوز نظام FUSE وحدة التخزين الخاصة الخارجية (التي تشمل الدليلين android/data وandroid/obb)، بينما لا يتم تركيب وحدة التخزين الداخلية (مثل /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، تكون معظم رحلات المستخدمين المهمة متساوية الأداء بين الإصدارَين 10 و11 من نظام التشغيل Android. ومع ذلك، عند اختبار مقاييس الأداء على مجموعة من عمليات الملفات، قد يكون أداء الإصدار 11 من نظام التشغيل Android أسوأ من الإصدار 10. بالنسبة إلى أنماط الوصول إلى الملفات التي يكون أداؤها أسوأ في Android 11 (مثل عمليات القراءة أو الكتابة العشوائية)، ننصح باستخدام واجهات برمجة التطبيقات MediaProvider لمنح التطبيقات وضع وصول غير FUSE، وهو الخيار الأفضل والأكثر اتساقًا من حيث الأداء.

تحديثات MediaProvider وFUSE

يختلف سلوك مكوّن النظام MediaProvider بين إصدارات Android.

  • في نظام التشغيل Android 10 والإصدارات الأقدم، كان SDCardFS هو نظام الملفات، وكان MediaProvider يوفّر واجهة لمجموعات الملفات (مثل الصور والفيديوهات وملفات الموسيقى وما إلى ذلك). عندما ينشئ تطبيق ملفًا باستخدام File API، يمكنه أن يطلب من MediaProvider فحص الملف وتسجيله في قاعدة البيانات.

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

في نظام التشغيل Android 11 والإصدارات الأحدث، يكون MediaProvider أيضًا أحد مكوّنات النظام النموذجية (أحد وحدات Mainline) التي يمكن تحديثها خارج نطاق إصدارات Android. وهذا يعني أنّه يمكن إصلاح المشاكل المتعلقة بالأداء أو الخصوصية أو الأمان التي تم رصدها في MediaProvider وتوفيرها عبر الأجهزة من خلال "متجر Google Play" أو آليات أخرى يوفّرها الشركاء. ويمكن أيضًا تعديل أي شيء يندرج ضمن نطاق ما هو متوقّع من معالج FUSE، ما يتيح إجراء تعديلات لإصلاح المشاكل المتعلقة بأداء FUSE.