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

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

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

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

با شروع Android 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، هر دستگاهی که پذیرفته نشده باشد، قابل حمل تلقی می شود. از آنجایی که فضای ذخیره‌سازی قابل حمل فقط برای مدت کوتاهی متصل است، پلتفرم از عملیات‌های سنگین مانند اسکن رسانه جلوگیری می‌کند. برنامه‌های شخص ثالث برای تعامل با فایل‌های موجود در فضای ذخیره‌سازی قابل حمل باید از چارچوب دسترسی به فضای ذخیره‌سازی عبور کنند. دسترسی مستقیم به صراحت به دلایل حفظ حریم خصوصی و امنیتی مسدود شده است.