تخزين

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

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

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

أذونات

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

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

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

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

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

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

لمزيد من المعلومات حول وضع READ_EXTERNAL_STORAGE إذن، انظر setWhitelistedRestrictedPermissions() في PackageInstaller.SessionParams الصف.

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

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

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

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

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