Storage

رمز HAL للتخزين الخارجي في Android

تطور نظام Android بمرور الوقت ليتوافق مع مجموعة كبيرة من أنواع وميزات أجهزة التخزين. تتوافق جميع إصدارات Android مع الأجهزة التي تتضمّن مساحة تخزين تقليدية، بما في ذلك مساحة التخزين القابلة للنقل والمحاكي. يمكن توفير مساحة تخزين محمولة باستخدام وسائط تخزين مادية، مثل بطاقة SD أو USB، وذلك لنقل البيانات مؤقتًا أو لتخزين الملفات. قد تظل الوسائط المادية مع الجهاز لفترة مديدة، ولكنها ليست مرتبطة بالجهاز ويمكن إزالتها. كانت بطاقات SD متاحة كوحدات تخزين محمولة منذ الإصدار 1.0 من نظام التشغيل Android، وقد أضاف الإصدار 6.0 من Android إمكانية استخدامها مع منفذ USB. يتم توفير مساحة التخزين المحاكاة من خلال عرض جزء من مساحة التخزين الداخلية من خلال طبقة محاكاة، وقد كانت متاحة منذ بدء استخدام Android 3.0.

بدءًا من الإصدار 6.0 من نظام التشغيل Android، يتيح هذا النظام وحدة تخزين قابلة للاستخدام، وهي تتوفّر في وسائط مادية، مثل بطاقة SD أو USB، ويتم تشفيرها وتنسيقها لتصبح مثل وحدة التخزين الداخلية. يمكن لميزة "مساحة التخزين القابلة للتخصيص" تخزين كل أنواع بيانات التطبيقات.

الأذونات

يتم حماية الوصول إلى وحدة التخزين الخارجية من خلال أذونات Android المختلفة. بدءًا من الإصدار 1.0 من Android، يتم حماية إذن الوصول للكتابة باستخدام الإذن WRITE_EXTERNAL_STORAGE. بدءًا من الإصدار 4.1 من نظام التشغيل Android، يتم حماية إذن الوصول إلى ميزة قراءة باستخدام إذن READ_EXTERNAL_STORAGE.

بدءًا من الإصدار 4.4 من Android، يتم الآن تجميع معلومات المالك والمجموعة والأوضاع الخاصة بالملفات على أجهزة التخزين الخارجية استنادًا إلى بنية الدليل. يتيح ذلك للتطبيقات إدارة الأدلة الخاصة بالحِزم على مساحة التخزين الخارجية بدون اشتراط أن يكون لديها إذن WRITE_EXTERNAL_STORAGE الواسع النطاق. على سبيل المثال، يمكن للتطبيق الذي يحمل اسم الحزمة com.example.foo الآن الوصول بحرية إلى Android/data/com.example.foo/ على الأجهزة التي تتضمّن مساحة تخزين خارجية بدون أي أذونات. يتم الحصول على هذه الأذونات المجمّعة من خلال التفاف حول أجهزة التخزين الأوّلية في برنامج FUSE الخفي.

بدءًا من الإصدار 10 من نظام التشغيل Android، تستخدم التطبيقات التي تستهدف الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم مساحة التخزين القديمة تلقائيًا، ويمكنها تفعيل مساحة التخزين المعزولة. يمكن للتطبيقات التي تستهدف الإصدار 10 من Android وتكون مُعدّة تلقائيًا للاستخدام مع مساحة تخزين معزولة إيقاف هذه الميزة مؤقتًا. استخدِم سمة البيان requestLegacyExternalStorage، التي تتحكّم في نموذج التخزين، لتغيير الحالة التلقائية.

بما أنّ إذنَي READ_EXTERNAL_STORAGE و WRITE_EXTERNAL_STORAGE محدودان بشكلٍ بسيط، إذا لم يُدرِج القائم بالتثبيت التطبيق في القائمة المسموح بها، يتحكّم الإذن في الوصول إلى المجموعات الصوتية والمرئية فقط، بدون الوصول إلى بطاقة SD. وينطبق ذلك حتى إذا كان التطبيق يطلب مساحة تخزين قديمة. لمزيد من المعلومات عن كلٍّ من القيود الصارمة والقيود غير الصارمة، يُرجى الاطّلاع على مقالة القيود الصارمة وغير الصارمة في Android 10.

إذا أضاف مُثبِّت التطبيق الإذن إلى القائمة البيضاء، سيحصل التطبيق الذي يعمل في الوضع القديم على سلوك الأذونات غير المعزولة. يتحكّم هذا الإذن في الوصول إلى بطاقة SD والمجموعات المسموعة والمرئية. ويحدث ذلك عندما يستهدف التطبيق الإصدار 9 من Android أو إصدارًا أقل ولا يوافق على استخدام مساحة التخزين المعزولة، أو عندما يستهدف الإصدار 10 من Android ويرفض استخدامها.

لا يمكن تحديد حالة القائمة البيضاء إلا في وقت التثبيت، ولا يمكن تغييرها إلا بعد تثبيت التطبيق.

لمزيد من المعلومات عن ضبط إذن READ_EXTERNAL_STORAGE ، اطّلِع على setWhitelistedRestrictedPermissions() في فئة PackageInstaller.SessionParams.

يقدّم نظام Android 13 أذونات وسائط دقيقة للسماح للتطبيقات بالوصول إلى ملفات الوسائط التي أنشأتها تطبيقات أخرى. على التطبيقات طلب إذن واحد أو أكثر من أذونات الوسائط الدقيقة المُدرَجة في أذونات الوسائط الدقيقة بدلاً من إذن READ_EXTERNAL_STORAGE.

يستند Android 14 إلى أذونات الوسائط الدقيقة للسماح للمستخدمين بمنح إذن بالوصول الجزئي إلى مكتبة الوسائط المرئية عندما تطلب التطبيقات أذونات الوسائط. اطّلِع على منح إذن وصول جزئي إلى الصور والفيديوهات للحصول على مزيد من المعلومات.

أذونات وقت التشغيل

يقدّم الإصدار 6.0 من Android نموذجًا جديدًا لأذونات وقت التشغيل، حيث تطلب التطبيقات الميزات عند الحاجة إليها في وقت التشغيل. بما أنّ النموذج الجديد يتضمّن أذونات READ/WRITE_EXTERNAL_STORAGE، يجب أن يمنح النظام الأساسي إذن الوصول إلى مساحة التخزين بشكل ديناميكي بدون إغلاق التطبيقات التي تعمل حاليًا أو إعادة تشغيلها. ويتم ذلك من خلال الاحتفاظ بثلاث طرق عرض مختلفة لجميع أجهزة التخزين المثبَّتة:

  • يتم عرض /mnt/runtime/default للتطبيقات التي لا تملك أذونات تخزين خاصة، وللمساحة الاسمية الجذر التي تتوفّر فيها adbd ومكونات النظام الأخرى.
  • يظهر الخيار /mnt/runtime/read للتطبيقات التي تستخدم READ_EXTERNAL_STORAGE (اضبط LEGACY_STORAGE لنظام التشغيل Android 10).
  • يتم عرض /mnt/runtime/write للتطبيقات التي تحتوي على WRITE_EXTERNAL_STORAGE

في وقت إنشاء نسخة من Zygote، ننشئ مساحة اسم ربط لكل تطبيق قيد التشغيل ونقوم بربط عرض المحتوى الأولي المناسب في مكانه. في وقت لاحق، عند منح أذونات وقت التشغيل، ينتقل vold إلى مساحة الاسم الخاصة بالربط في التطبيقات التي تعمل حاليًا ويربط الربط طريقة العرض التي تمت ترقيتها في مكانها. يُرجى العِلم أنّه عند خفض مستوى الأذونات، يتم دائمًا إغلاق التطبيق.

تتطلّب وظيفة setns() المستخدَمة لتنفيذ هذه الميزة استخدام الإصدار 3.8 من نظام التشغيل Linux على الأقل، ولكن تم نقل التصحيحات بنجاح إلى الإصدار 3.4 من نظام التشغيل Linux. يمكن استخدام اختبار PermissionsHostTest CTS للتحقّق من سلوك kernel الصحيح.