تخزين

رمز 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 الصحيح.