اندروید در طول زمان به گونه ای تکامل یافته است که از انواع مختلف و ویژگی های دستگاه ذخیره سازی پشتیبانی می کند. همه نسخههای اندروید از دستگاههای دارای حافظه سنتی پشتیبانی میکنند که شامل فضای ذخیرهسازی قابل حمل و شبیهسازی شده است. فضای ذخیرهسازی قابل حمل را میتوان توسط رسانههای فیزیکی مانند کارت 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 را هدف قرار میدهند و بهطور پیشفرض کمتر به حافظه قدیمی میرسند و میتوانند در فضای ذخیرهسازی ایزوله شرکت کنند . برنامههایی که اندروید 10 را هدف قرار میدهند و بهطور پیشفرض روی فضای ذخیرهسازی ایزوله قرار میگیرند، میتوانند به طور موقت از آن انصراف دهند . از ویژگی manifest requestLegacyExternalStorage
که مدل ذخیره سازی را کنترل می کند، برای تغییر حالت پیش فرض استفاده کنید.
از آنجایی که هر دو مجوز READ_EXTERNAL_STORAGE
و WRITE_EXTERNAL_STORAGE
دارای محدودیت نرم افزاری هستند، اگر نصب کننده برنامه را در لیست سفید قرار نداده باشد، مجوز فقط دسترسی به مجموعه های شنیداری و تصویری را بدون دسترسی به کارت SD کنترل می کند. حتی اگر برنامه فضای ذخیرهسازی قدیمی را درخواست کند، این مورد اعمال میشود. برای اطلاعات بیشتر در مورد محدودیتهای سخت و محدودیتهای نرم، محدودیتهای سخت و نرم را در Android 10 ببینید.
اگر نصبکننده مجوز را در لیست سفید قرار داده باشد، برنامهای که در حالت قدیمی اجرا میشود، رفتار مجوز غیر ایزوله را دریافت میکند. این مجوز دسترسی به کارت SD و مجموعه های شنیداری و بصری را کنترل می کند. این زمانی اتفاق میافتد که برنامه اندروید 9 یا پایینتر را هدف قرار میدهد و در فضای ذخیرهسازی ایزوله شرکت نمیکند، یا اندروید 10 را هدف قرار میدهد و انصراف میدهد.
وضعیت لیست سفید را می توان فقط در زمان نصب مشخص کرد و تا زمانی که برنامه نصب نشده باشد نمی توان آن را تغییر داد.
برای اطلاعات بیشتر در مورد تنظیم مجوز READ_EXTERNAL_STORAGE
، به setWhitelistedRestrictedPermissions()
در کلاس PackageInstaller.SessionParams مراجعه کنید.
اندروید 13 مجوزهای رسانه ای را برای پشتیبانی از برنامه هایی که به فایل های رسانه ای ایجاد شده توسط برنامه های دیگر دسترسی دارند، معرفی می کند. برنامه ها باید به جای مجوز READ_EXTERNAL_STORAGE
، یک یا چند مورد از مجوزهای رسانه ریز فهرست شده در مجوزهای رسانه Granular را درخواست کنند.
Android 14 مبتنی بر مجوزهای رسانه ای گرانول است تا به کاربران اجازه دهد وقتی برنامه ها مجوزهای رسانه را درخواست می کنند، به کتابخانه رسانه تصویری خود دسترسی جزئی بدهند. برای اطلاعات بیشتر به اجازه دسترسی جزئی به عکسها و ویدیوها مراجعه کنید.
مجوزهای زمان اجرا
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 را می توان برای تأیید رفتار صحیح هسته استفاده کرد.