التخزين التقليدي

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

يدعم Android الأجهزة ذات وحدة التخزين التقليدية، والتي تم تعريفها على أنها نظام ملفات غير حساس لحالة الأحرف مع فئات وأوضاع أذونات POSIX غير قابلة للتغيير. يشمل مفهوم التخزين التقليدي التخزين المحاكي والمحمول. يتم تعريف التخزين المحمول على أنه أي وحدة تخزين خارجية لا يعتمدها النظام وبالتالي لا يتم تنسيقها أو تشفيرها أو ربطها بجهاز معين. نظرًا لأن وحدات التخزين الخارجية التقليدية توفر الحد الأدنى من الحماية للبيانات المخزنة، فلا ينبغي أن يقوم رمز النظام بتخزين البيانات الحساسة على وحدة تخزين خارجية. على وجه التحديد، يجب تخزين ملفات التكوين والسجل فقط على وحدة التخزين الداخلية حيث يمكن حمايتها بشكل فعال.

وحدة تخزين خارجية متعددة المستخدمين

بدءًا من Android 4.2، يمكن للأجهزة دعم عدة مستخدمين، ويجب أن تستوفي وحدة التخزين الخارجية القيود التالية:

  • يجب أن يكون لدى كل مستخدم وحدة تخزين خارجية أساسية معزولة خاصة به، ويجب ألا يكون لديه حق الوصول إلى وحدة التخزين الخارجية الأساسية للمستخدمين الآخرين.
  • يجب أن يحل مسار /sdcard إلى وحدة التخزين الخارجية الأساسية الصحيحة الخاصة بالمستخدم بناءً على المستخدم الذي تعمل العملية به.
  • يمكن مشاركة تخزين ملفات OBB الكبيرة في دليل Android/obb بين عدة مستخدمين كتحسين.
  • يجب ألا تكون وحدة التخزين الخارجية الثانوية قابلة للكتابة بواسطة التطبيقات، إلا في الأدلة الخاصة بالحزمة على النحو الذي تسمح به الأذونات المركبة.

يعمل تطبيق النظام الأساسي الافتراضي لهذه الميزة على تعزيز مساحات أسماء Linux kernel لإنشاء جداول تحميل معزولة لكل عملية متفرعة من Zygote، ثم يستخدم أدوات ربط الربط لتقديم وحدة التخزين الخارجية الأساسية الصحيحة الخاصة بالمستخدم في مساحة الاسم الخاصة تلك.

عند التمهيد، يقوم النظام بتحميل برنامج FUSE للتخزين الخارجي الذي تمت محاكاته في EMULATED_STORAGE_SOURCE ، والذي يكون مخفيًا عن التطبيقات. بعد تشعبات Zygote، يتم ربط الدليل الفرعي المناسب الخاص بالمستخدم من ضمن البرنامج الخفي FUSE إلى EMULATED_STORAGE_TARGET بحيث يتم حل مسارات التخزين الخارجية بشكل صحيح للتطبيق. نظرًا لأن التطبيق يفتقر إلى نقاط تثبيت يمكن الوصول إليها لتخزين المستخدمين الآخرين، فيمكنهم فقط الوصول إلى مساحة التخزين الخاصة بالمستخدم الذي بدأ التطبيق به.

يستخدم هذا التنفيذ أيضًا ميزة kernel للشجرة الفرعية المشتركة لنشر أحداث التحميل من مساحة الاسم الجذر الافتراضية إلى مساحات أسماء التطبيقات، مما يضمن استمرار عمل ميزات مثل حاويات ASEC وتركيب OBB بشكل صحيح. يقوم بذلك عن طريق تركيب rootfs كمشترك، ثم إعادة تركيبه كعبد بعد إنشاء كل مساحة اسم Zygote.

أجهزة تخزين خارجية متعددة

بدءًا من Android 4.4، يتم عرض أجهزة تخزين خارجية متعددة للمطورين من خلال Context.getExternalFilesDirs() و Context.getExternalCacheDirs() و Context.getObbDirs() .

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

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

دعم وسائط USB

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

في Android 6.0، يعتبر أي جهاز غير معتمد محمولاً. نظرًا لأن وحدة التخزين المحمولة متصلة لفترة قصيرة فقط، فإن النظام الأساسي يتجنب العمليات الثقيلة مثل فحص الوسائط. يجب أن تمر تطبيقات الطرف الثالث عبر إطار عمل الوصول إلى التخزين للتفاعل مع الملفات الموجودة على وحدة التخزين المحمولة؛ يتم حظر الوصول المباشر بشكل صريح لأسباب تتعلق بالخصوصية والأمان.