تخزين

رمز HAL لوحدة التخزين الخارجية لنظام Android

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

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

أذونات

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

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

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

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

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

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

لمزيد من المعلومات حول تعيين إذن READ_EXTERNAL_STORAGE ، راجع setWhitelistedRestrictedPermissions() في فئة PackageInstaller.SessionParams .

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

يقدم Android 6.0 نموذجًا جديدًا لأذونات وقت التشغيل حيث تطلب التطبيقات إمكانات عند الحاجة في وقت التشغيل. نظرًا لأن النموذج الجديد يتضمن أذونات 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 fork time ، نقوم بإنشاء مساحة اسم تحميل لكل تطبيق قيد التشغيل وربط تثبيت العرض الأولي المناسب في مكانه. في وقت لاحق ، عندما يتم منح أذونات وقت التشغيل ، يقفز vold إلى مساحة اسم التحميل للتطبيقات قيد التشغيل بالفعل ويثبت ربط العرض الذي تمت ترقيته في مكانه. لاحظ أن تخفيض الأذونات يؤدي دائمًا إلى إنهاء التطبيق.

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