ذخیره سازی سنتی

نماد حافظه خارجی HAL اندروید

اندروید از دستگاه‌هایی با فضای ذخیره‌سازی سنتی پشتیبانی می‌کند، که تعریف می‌شود یک فایل سیستم حساس به حروف بزرگ و کوچک با کلاس‌ها و حالت‌های مجوز غیرقابل تغییر POSIX است. مفهوم ذخیره سازی سنتی شامل ذخیره سازی شبیه سازی شده و قابل حمل است. ذخیره سازی قابل حمل به عنوان هر حافظه خارجی که توسط سیستم پذیرفته نشده است تعریف می شود و بنابراین فرمت و رمزگذاری نشده یا به یک دستگاه خاص گره خورده است. از آنجایی که حافظه خارجی سنتی حداقل حفاظت را برای داده های ذخیره شده ارائه می دهد، کد سیستم نباید داده های حساس را در حافظه خارجی ذخیره کند. به طور خاص، فایل‌های پیکربندی و گزارش باید فقط در حافظه داخلی ذخیره شوند، جایی که بتوان به طور موثر محافظت کرد.

حافظه خارجی چند کاربره

با شروع اندروید 4.2، دستگاه‌ها می‌توانند چندین کاربر را پشتیبانی کنند و حافظه خارجی باید محدودیت‌های زیر را داشته باشد:

  • هر کاربر باید حافظه خارجی اصلی جدا شده خود را داشته باشد و نباید به حافظه خارجی اصلی سایر کاربران دسترسی داشته باشد.
  • مسیر /sdcard باید بر اساس کاربری که یک فرآیند به عنوان آن در حال اجرا است، به حافظه خارجی اولیه و مخصوص کاربر برسد.
  • فضای ذخیره سازی برای فایل های OBB بزرگ در فهرست Android/obb ممکن است به عنوان بهینه سازی بین چندین کاربر به اشتراک گذاشته شود.
  • حافظه خارجی ثانویه نباید توسط برنامه‌ها قابل نوشتن باشد، مگر در فهرست‌های راهنمای خاص بسته که توسط مجوزهای ترکیب شده مجاز است.

پیاده‌سازی پلتفرم پیش‌فرض این ویژگی از فضاهای نام هسته لینوکس برای ایجاد جداول mount جدا شده برای هر فرآیند Zygote-forked استفاده می‌کند و سپس از bind mount برای ارائه فضای ذخیره‌سازی خارجی اولیه خاص کاربر در آن فضای نام خصوصی استفاده می‌کند.

هنگام راه‌اندازی، سیستم یک شبح FUSE حافظه خارجی شبیه‌سازی شده را در EMULATED_STORAGE_SOURCE نصب می‌کند که از برنامه‌ها پنهان است. پس از انشعاب Zygote، زیرشاخه مخصوص کاربر را از زیر دیمون FUSE به EMULATED_STORAGE_TARGET متصل می کند تا مسیرهای ذخیره سازی خارجی به درستی برای برنامه حل شوند. از آنجایی که یک برنامه فاقد نقاط اتصال قابل دسترسی برای فضای ذخیره‌سازی سایر کاربران است، آن‌ها فقط می‌توانند به فضای ذخیره‌سازی برای کاربری دسترسی داشته باشند که در آن راه‌اندازی شده است.

این پیاده‌سازی همچنین از ویژگی هسته زیردرخت مشترک برای انتشار رویدادهای mount از فضای نام ریشه پیش‌فرض در فضای نام برنامه استفاده می‌کند، که تضمین می‌کند ویژگی‌هایی مانند کانتینرهای ASEC و نصب OBB به درستی کار می‌کنند. این کار را با نصب rootfs به صورت اشتراکی انجام می‌دهد و بعد از ایجاد هر فضای نام Zygote، آن را به‌عنوان Slave دوباره نصب می‌کند.

چندین دستگاه ذخیره سازی خارجی

با شروع Android 4.4، چندین دستگاه ذخیره سازی خارجی از طریق Context.getExternalFilesDirs() , Context.getExternalCacheDirs() و Context.getObbDirs() برای توسعه دهندگان ظاهر می شوند.

دستگاه‌های ذخیره‌سازی خارجی که از طریق این APIها ظاهر می‌شوند باید بخش نیمه دائمی دستگاه باشند (مانند یک اسلات کارت SD در محفظه باتری). توسعه دهندگان انتظار دارند داده های ذخیره شده در این مکان ها در مدت زمان طولانی در دسترس باشند. به همین دلیل، دستگاه های ذخیره سازی گذرا (مانند درایوهای ذخیره سازی انبوه USB) نباید از طریق این API ها ظاهر شوند.

مجوز WRITE_EXTERNAL_STORAGE فقط باید به حافظه خارجی اصلی یک دستگاه دسترسی نوشتن بدهد. برنامه‌ها نباید اجازه داشته باشند در دستگاه‌های ذخیره‌سازی خارجی ثانویه بنویسند، مگر در فهرست‌های راهنمای مخصوص بسته‌شان که مجوزهای ترکیب‌شده مجاز است. محدود کردن نوشتن به این روش تضمین می‌کند که سیستم می‌تواند فایل‌ها را زمانی که برنامه‌ها حذف می‌شوند پاک کند.

پشتیبانی از رسانه USB

Android 6.0 از دستگاه های ذخیره سازی قابل حملی پشتیبانی می کند که فقط برای مدت زمان کوتاهی به دستگاه متصل می شوند، مانند درایوهای فلش USB. هنگامی که کاربر یک دستگاه قابل حمل جدید را وارد می کند، پلتفرم اعلانی را نشان می دهد که به او اجازه می دهد محتویات آن دستگاه را کپی یا مدیریت کند.

در اندروید 6.0، هر دستگاهی که پذیرفته نشده باشد، قابل حمل تلقی می شود. از آنجایی که فضای ذخیره‌سازی قابل حمل فقط برای مدت کوتاهی متصل است، پلتفرم از عملیات‌های سنگین مانند اسکن رسانه جلوگیری می‌کند. برنامه‌های شخص ثالث برای تعامل با فایل‌های موجود در فضای ذخیره‌سازی قابل حمل باید از چارچوب دسترسی به فضای ذخیره‌سازی عبور کنند. دسترسی مستقیم به صراحت به دلایل حفظ حریم خصوصی و امنیتی مسدود شده است.