ذخیره سازی

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

اندروید در طول زمان به گونه ای تکامل یافته است که از انواع مختلف و ویژگی های دستگاه ذخیره سازی پشتیبانی می کند. همه نسخه‌های اندروید از دستگاه‌های ذخیره‌سازی سنتی پشتیبانی می‌کنند که شامل فضای ذخیره‌سازی قابل حمل و شبیه‌سازی شده است. فضای ذخیره‌سازی قابل حمل را می‌توان توسط رسانه‌های فیزیکی، مانند کارت SD یا USB، که برای انتقال موقت داده/ذخیره‌سازی فایل است، ارائه کرد. رسانه فیزیکی ممکن است برای مدت طولانی در دستگاه باقی بماند، اما به دستگاه متصل نیست و ممکن است برداشته شود. کارت‌های SD از Android 1.0 به‌عنوان حافظه قابل حمل در دسترس بوده‌اند. Android 6.0 پشتیبانی USB را اضافه کرد. فضای ذخیره سازی شبیه سازی شده با نمایش بخشی از حافظه داخلی از طریق یک لایه شبیه سازی ارائه می شود و از اندروید 3.0 در دسترس بوده است.

با شروع Android 6.0، Android از فضای ذخیره‌سازی قابل قبول پشتیبانی می‌کند که توسط رسانه‌های فیزیکی مانند کارت SD یا USB ارائه می‌شود که رمزگذاری و فرمت‌شده است تا مانند حافظه داخلی عمل کند. ذخیره سازی قابل قبول می تواند انواع داده های برنامه را ذخیره کند.

مجوزها

دسترسی به حافظه خارجی توسط مجوزهای مختلف اندروید محافظت می شود. با شروع Android 1.0، دسترسی به نوشتن با مجوز WRITE_EXTERNAL_STORAGE محافظت می شود. با شروع Android 4.1، دسترسی خواندن با مجوز READ_EXTERNAL_STORAGE محافظت می شود.

با شروع اندروید 4.4، مالک، گروه و حالت‌های فایل‌ها در دستگاه‌های ذخیره‌سازی خارجی اکنون بر اساس ساختار دایرکتوری ترکیب می‌شوند. این به برنامه‌ها امکان می‌دهد دایرکتوری‌های بسته خاص خود را در حافظه خارجی بدون نیاز به داشتن مجوز گسترده WRITE_EXTERNAL_STORAGE مدیریت کنند. برای مثال، برنامه با نام بسته com.example.foo اکنون می‌تواند آزادانه به Android/data/com.example.foo/ در دستگاه‌های ذخیره‌سازی خارجی بدون مجوز دسترسی داشته باشد. این مجوزهای سنتز شده با بسته بندی دستگاه های ذخیره سازی خام در یک دیمون FUSE انجام می شود.

از Android 10 شروع می‌شود، برنامه‌هایی که Android 9 را هدف قرار می‌دهند و به‌طور پیش‌فرض فضای ذخیره‌سازی قدیمی را کاهش می‌دهند و می‌توانند در فضای ذخیره‌سازی ایزوله شرکت کنند. برنامه‌هایی که Android 10 را هدف قرار می‌دهند و به‌طور پیش‌فرض روی فضای ذخیره‌سازی ایزوله قرار می‌گیرند، می‌توانند به طور موقت از آن انصراف دهند. از ویژگی manifest requestLegacyExternalStorage که مدل ذخیره سازی را کنترل می کند، برای تغییر حالت پیش فرض استفاده کنید.

از آنجایی که هر دو مجوز READ_EXTERNAL_STORAGE و WRITE_EXTERNAL_STORAGE دارای محدودیت نرم افزاری هستند، اگر نصب کننده برنامه را در لیست سفید قرار نداده باشد، مجوز فقط دسترسی به مجموعه های شنیداری و بصری را بدون دسترسی به کارت SD کنترل می کند. این امر حتی اگر برنامه فضای ذخیره‌سازی قدیمی را درخواست کند اعمال می‌شود. برای اطلاعات بیشتر در مورد محدودیت‌های سخت و محدودیت‌های نرم، محدودیت‌های سخت و نرم را در Android 10 ببینید.

اگر نصب‌کننده مجوز را در لیست سفید قرار داده باشد، برنامه‌ای که در حالت قدیمی اجرا می‌شود، رفتار مجوز غیر ایزوله را دریافت می‌کند. این مجوز دسترسی به کارت SD و مجموعه های شنیداری و بصری را کنترل می کند. این زمانی اتفاق می‌افتد که برنامه اندروید 9 یا پایین‌تر را هدف قرار می‌دهد و در فضای ذخیره‌سازی ایزوله شرکت نمی‌کند، یا آندروید 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، ما یک فضای نام mount برای هر برنامه در حال اجرا ایجاد می کنیم و mount نمای اولیه مناسب را در محل قرار می دهیم. بعداً، وقتی مجوزهای زمان اجرا اعطا شد، vold به فضای نام مانت برنامه‌های در حال اجرا می‌پرد و نمای ارتقایافته را در محل نصب می‌کند. توجه داشته باشید که کاهش مجوز همیشه منجر به از بین رفتن برنامه می شود.

عملکرد setns() مورد استفاده برای پیاده سازی این ویژگی حداقل به لینوکس 3.8 نیاز دارد، اما وصله ها با موفقیت به لینوکس 3.4 بکپورت شده اند. تست PermissionsHostTest CTS را می توان برای تأیید رفتار صحیح هسته استفاده کرد.