Storage

نماد HAL فضای ذخیره‌سازی خارجی Android

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

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

اجازه‌ها

دسترسی به فضای ذخیره‌سازی خارجی با اجازه‌های مختلف Android محافظت می‌شود. از Android نسخه ۱.۰، دسترسی نوشتن با اجازه WRITE_EXTERNAL_STORAGE محافظت می‌شود. از Android نسخه ۴.۱ به بعد، دسترسی خواندن با اجازه READ_EXTERNAL_STORAGE محافظت می‌شود.

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

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

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

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

وضعیت فهرست سفید فقط در زمان نصب می‌تواند مشخص شود و تا زمانی که برنامه نصب نشده است نمی‌تواند تغییر کند.

برای اطلاعات بیشتر درباره تنظیم اجازه READ_EXTERNAL_STORAGE ، setWhitelistedRestrictedPermissions() را در کلاس PackageInstaller.SessionParams ببینید.

‫Android 13 اجازه‌های رسانه‌ای دانه‌دریزی را برای پشتیبانی از برنامه‌هایی که به فایل‌های رسانه‌ای ایجادشده توسط برنامه‌های دیگر دسترسی دارند معرفی می‌کند. برنامه‌ها باید به‌جای اجازه READ_EXTERNAL_STORAGE، یک یا چند مورد از اجازه‌های رسانه دقیق فهرست‌شده در اجازه‌های رسانه دقیق را درخواست کنند.

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

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