Storage

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

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

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

الأذونات

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

بدءًا من الإصدار Android 4.4، يتم الآن تجميع المالك ومجموعة الملفات وأوضاعها على أجهزة التخزين الخارجية استنادًا إلى بنية الدليل. يتيح ذلك للتطبيقات إدارة الأدلة الخاصة بالحِزم على مساحة التخزين الخارجية بدون اشتراط أن يكون لديها إذن 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. يمكن استخدام اختبار CTS PermissionsHostTest للتحقّق من سلوك النواة الصحيح.