تخزين مُفصَّل

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

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

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

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

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

استخدم التخزين المحدد مع FUSE

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

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

الصمامات وSDCardFS

لا يرتبط دعم Android 11 لـ FUSE بإيقاف SDCardFS ، ولكنه يوفر بديلاً لـ Media Store للأجهزة التي كانت تستخدم SDCardFS مسبقًا. الأجهزة:

  • لا يمكن للتشغيل باستخدام Android 11 أو الإصدارات الأحدث باستخدام kernel 5.4 أو أعلى استخدام SDCardFS.
  • يمكن للترقية إلى Android 11 أو الإصدارات الأحدث استضافة FUSE أعلى SDCardFS لاعتراض عمليات الملفات وتحقيق أهداف الخصوصية.

ضبط أداء الصمامات

كان Android يدعم FUSE مسبقًا في Android 7 أو الإصدارات الأقدم، حيث تم تركيب وحدة التخزين الخارجية على أنها FUSE. نظرًا لمشكلات الأداء والتوقف التام في تنفيذ FUSE، قدم Android 8 SDCardFS. يعيد Android 11 تقديم الدعم لـ FUSE باستخدام تطبيق محسّن ومختبر بشكل أفضل لـ libfuse والذي يمكن ضبطه لحل مشكلات الأداء في Android 7 أو الإصدارات الأقدم.

يتضمن ضبط FUSE التعديلات التالية:

  • تجاوز FUSE لأدلة Android/data و Android/obb لتحسين أداء تطبيقات الألعاب التي تعتمد على هذه الأدلة.
  • التحسينات (مثل ضبط نسب القراءة المسبقة والقذرة لنظام ملفات FUSE) للحفاظ على أداء القراءة وتشغيل الوسائط بسلاسة.
  • استخدام ذاكرة التخزين المؤقت للكتابة فيوز.
  • أذونات التخزين المؤقت لتقليل IPCs إلى خادم النظام.
  • تحسينات للتطبيقات التي يمكنها الوصول إلى جميع الملفات لجعل العمليات المجمعة أسرع.

يمكن لتعديلات الضبط المذكورة أعلاه أن تنتج أداءً مشابهًا بين أجهزة FUSE والأجهزة غير التابعة لـ FUSE. على سبيل المثال، وجد اختبار Pixel 2 الذي تم ضبطه باستخدام FUSE وPixel 2 باستخدام Media Store أداء قراءة تسلسليًا مشابهًا (على سبيل المثال، تشغيل الفيديو) بين الوصول إلى مسار الملف وMedia Store. ومع ذلك، كانت عمليات الكتابة المتسلسلة أسوأ قليلاً مع FUSE، وقد تكون عمليات القراءة والكتابة العشوائية أبطأ بما يصل إلى الضعف.

يمكن أن تتغير قياسات الأداء من جهاز لآخر وبين حالات استخدام محددة. نظرًا لأن واجهات برمجة تطبيقات MediaProvider توفر الأداء الأكثر اتساقًا، يجب على مطوري التطبيقات المهتمين بالأداء استخدام واجهات برمجة تطبيقات MediaProvider لتطبيقاتهم.

التخفيف من تأثير أداء FUSE

يقتصر تأثير أداء FUSE على المستخدمين الكثيفين للملفات المخزنة على وحدة تخزين مشتركة خارجية فقط. يتم تجاوز وحدة التخزين الخارجية الخاصة (التي تتضمن أدلة android/data و android/obb ) بواسطة FUSE، بينما لا يتم تثبيت FUSE على وحدة التخزين الداخلية (مثل /data/data ، حيث تقوم العديد من التطبيقات بتخزين البيانات لإبقائها مشفرة وآمنة).

  • غالبًا ما تتفاعل التطبيقات التي تستخدم وحدات تخزين خارجية مشتركة بشكل خفيف مع مجموعة محدودة من الملفات (عادةً أقل من 100 ملف). تستفيد هذه التطبيقات من التحسينات الحالية لعمليات القراءة والكتابة الشائعة ويجب ألا تشهد أي تأثير على الأداء متعلق بـ FUSE في Android 11.

  • عادةً ما تقوم التطبيقات التي تستخدم بكثرة لوحدات التخزين الخارجية المشتركة بعمليات ملفات مجمعة، مثل إدراج أو إزالة دليل يحتوي على 1000 ملف، أو إنشاء أو حذف دليل يحتوي على مليون ملف على نظام الملفات. قد تتأثر عمليات الملفات المجمعة بـ 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 لمنح التطبيقات وضع وصول غير FUSE، وهو الخيار الأفضل والأداء المستمر.

تحديثات MediaProvider وFUSE

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

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

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

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