فضای ذخیرهسازی محدود، دسترسی برنامهها به فضای ذخیرهسازی خارجی را محدود میکند. در اندروید ۱۱ یا بالاتر، برنامههایی که API 30 یا بالاتر را هدف قرار میدهند، باید از فضای ذخیرهسازی محدود استفاده کنند. پیش از این در اندروید ۱۰، برنامهها میتوانستند از فضای ذخیرهسازی محدود انصراف دهند.
محدودیتهای دسترسی به برنامهها
هدف از ذخیرهسازی محدود، محافظت از حریم خصوصی دادههای برنامه و کاربر است. این شامل محافظت از اطلاعات کاربر (مانند ابرداده عکس)، جلوگیری از تغییر یا حذف فایلهای کاربر توسط برنامهها بدون اجازه صریح و محافظت از اسناد حساس کاربر که در پوشههای دانلود یا سایر پوشهها دانلود شدهاند، میشود.
برنامههایی که از فضای ذخیرهسازی محدود استفاده میکنند میتوانند سطوح دسترسی زیر را داشته باشند (دسترسی واقعی به پیادهسازی خاص بستگی دارد).
- دسترسی خواندن و نوشتن به فایلهای خودشان بدون هیچ مجوزی
- دسترسی به فایلهای رسانهای سایر برنامهها با مجوز
READ_EXTERNAL_STORAGE - دسترسی نوشتن به فایلهای رسانهای سایر برنامهها فقط با رضایت مستقیم کاربر مجاز است (استثنائاتی برای گالری سیستم و برنامههایی که واجد شرایط دسترسی به همه فایلها هستند، اعطا میشود)
- عدم دسترسی خواندن یا نوشتن به دایرکتوریهای دادههای خارجی برنامههای دیگر
استفاده از فضای ذخیرهسازی محدود با FUSE
اندروید ۱۱ یا بالاتر از سیستم فایل در فضای کاربری (FUSE) پشتیبانی میکند، که ماژول MediaProvider را قادر میسازد تا عملیات فایل را در فضای کاربری بررسی کند و بر اساس سیاست اجازه ، رد یا ویرایش دسترسی، دسترسی به فایلها را مسدود کند. برنامههای موجود در فضای ذخیرهسازی محدود که از FUSE استفاده میکنند، ویژگیهای حریم خصوصی فضای ذخیرهسازی محدود و امکان دسترسی به فایلها را با استفاده از یک مسیر فایل مستقیم (که APIهای فایل را در برنامهها فعال نگه میدارد) دریافت میکنند.
اندروید ۱۰ قوانین ذخیرهسازی محدود را در مورد دسترسی به فایلها توسط MediaProvider اعمال میکرد، اما نه برای دسترسی مستقیم به مسیر فایل (به عنوان مثال، با استفاده از API فایل و APIهای NDK) به دلیل تلاش مورد نیاز برای رهگیری فراخوانیهای هسته. در نتیجه، برنامههای موجود در ذخیرهسازی محدود نمیتوانستند با استفاده از یک مسیر فایل مستقیم به فایلها دسترسی داشته باشند. این محدودیت بر توانایی توسعهدهندگان برنامه برای سازگاری تأثیر گذاشت، زیرا برای بازنویسی دسترسی API فایل به API MediaProvider، نیاز به تغییرات اساسی در کد بود.
فیوز و SDCardFS
پشتیبانی اندروید ۱۱ از FUSE ربطی به منسوخ شدن SDCardFS ندارد، اما جایگزینی برای Media Store برای دستگاههایی که قبلاً از SDCardFS استفاده میکردند، ارائه میدهد. دستگاهها:
- راهاندازی با اندروید ۱۱ یا بالاتر با استفاده از کرنل ۵.۴ یا بالاتر نمیتواند از SDCardFS استفاده کند.
- ارتقا به اندروید ۱۱ یا بالاتر میتواند میزبان FUSE روی SDCardFS باشد تا عملیات فایل را رهگیری کرده و اهداف حریم خصوصی را برآورده کند.
تنظیم عملکرد فیوز
اندروید قبلاً در اندروید ۷ یا پایینتر از FUSE پشتیبانی میکرد، که در آن حافظه خارجی به عنوان FUSE نصب میشد. به دلیل مشکلات عملکرد و بنبست در پیادهسازی FUSE، اندروید ۸ SDCardFS را معرفی کرد. اندروید ۱۱ با استفاده از یک پیادهسازی بهبود یافته و آزمایششدهتر از libfuse که میتواند برای حل مشکلات عملکرد در اندروید ۷ یا پایینتر تنظیم شود، پشتیبانی از FUSE را دوباره ارائه میدهد.
تنظیم فیوز شامل تنظیمات زیر است:
- دور زدن FUSE برای دایرکتوریهای
Android/dataوAndroid/obbبرای بهبود عملکرد برنامههای بازی که به این دایرکتوریها متکی هستند. - بهینهسازیها (مانند تنظیم نسبتهای read-ahead و dirty در سیستم فایل FUSE) برای حفظ عملکرد readها و روان نگه داشتن پخش رسانه.
- استفاده از حافظه نهان رایت-بک FUSE.
- مجوزهای ذخیرهسازی برای کاهش IPCها به سرور سیستم.
- بهینهسازیهایی برای برنامههایی که به All Files دسترسی دارند تا عملیات دستهای سریعتر انجام شود.
تنظیمات تنظیمی فوق میتوانند عملکرد قابل مقایسهای را بین دستگاههای FUSE و غیر FUSE ایجاد کنند. به عنوان مثال، آزمایش یک Pixel 2 تنظیمشده با استفاده از FUSE و یک Pixel 2 با استفاده از Media Store، عملکرد خواندن ترتیبی قابل مقایسهای (به عنوان مثال، پخش ویدیو) را بین دسترسی به مسیر فایل و Media Store نشان داد. با این حال، نوشتنهای ترتیبی با FUSE کمی بدتر بودند و خواندن و نوشتنهای تصادفی میتوانستند تا دو برابر کندتر باشند.
معیارهای عملکرد میتوانند از دستگاهی به دستگاه دیگر و بین موارد استفاده خاص تغییر کنند. از آنجا که APIهای MediaProvider پایدارترین عملکرد را ارائه میدهند، توسعهدهندگان برنامههایی که نگران عملکرد هستند باید از APIهای MediaProvider برای برنامههای خود استفاده کنند.
کاهش تأثیر بر عملکرد FUSE
تأثیر FUSE بر عملکرد، فقط به کاربرانی که از فایلهای ذخیره شده در حافظه مشترک خارجی زیاد استفاده میکنند، محدود میشود. حافظه خصوصی خارجی (که شامل دایرکتوریهای android/data و android/obb میشود) توسط FUSE نادیده گرفته میشود، در حالی که حافظه داخلی (مانند /data/data که بسیاری از برنامهها دادهها را برای رمزگذاری و ایمن نگه داشتن آنها ذخیره میکنند) توسط FUSE نصب نمیشود.
برنامههایی که به ندرت از فضای ذخیرهسازی خارجی مشترک استفاده میکنند، اغلب با مجموعه محدودی از فایلها (معمولاً کمتر از ۱۰۰ فایل) تعامل دارند. این برنامهها از بهینهسازیهای موجود برای عملیات خواندن و نوشتن رایج بهرهمند میشوند و نباید هیچ تأثیر عملکردی مرتبط با FUSE را در اندروید ۱۱ مشاهده کنند.
برنامههایی که از فضای ذخیرهسازی خارجی مشترک استفاده زیادی میکنند، معمولاً عملیات حجیم فایل، مانند فهرست کردن یا حذف یک دایرکتوری با ۱۰۰۰ فایل، یا ایجاد یا حذف یک دایرکتوری با یک میلیون فایل در سیستم فایل را انجام میدهند. عملیات حجیم فایل ممکن است تحت تأثیر FUSE در اندروید ۱۱ قرار گیرد، اما اگر چنین برنامههایی واجد شرایط مجوز
MANAGE_EXTERNAL_STORAGEباشند، از بهینهسازیهای عملکرد موجود در بهروزرسانی اکتبر ۲۰۲۰ بهرهمند میشوند.
برای جلوگیری از سربار عملکرد FUSE، برنامهها میتوانند دادهها را در فضای ذخیرهسازی خصوصی خارجی ذخیره کنند یا از APIهای حجیم در کلاس ContentProvider برای دور زدن FUSE و دریافت یک مسیر بهینه از نظر عملکرد استفاده کنند. علاوه بر این، بهروزرسانی اکتبر 2020 برای مؤلفه سیستم MediaProvider شامل بهینهسازی عملکرد برای مدیران فایل و برنامههای مشابه (مانند پشتیبانگیری/بازیابی، آنتیویروس) است که مجوز MANAGE_EXTERNAL_STORAGE را دارند.
حریم خصوصی بر عملکرد ارجحیت دارد
در دستگاههایی که برای FUSE تنظیم شدهاند، اکثر مسیرهای حیاتی کاربر بین اندروید ۱۰ و اندروید ۱۱ به یک اندازه عملکرد خوبی دارند. با این حال، هنگام آزمایش بنچمارکها روی مجموعهای از عملیات فایل، اندروید ۱۱ ممکن است عملکرد بدتری نسبت به اندروید ۱۰ داشته باشد. برای الگوهای دسترسی به فایل که در اندروید ۱۱ عملکرد بدتری دارند (به عنوان مثال، خواندن یا نوشتن تصادفی)، توصیه میکنیم از APIهای MediaProvider برای دادن حالت دسترسی غیر FUSE به برنامهها استفاده کنید، که بهترین و پایدارترین گزینه است.
بهروزرسانیهای MediaProvider و FUSE
رفتار کامپوننت سیستمی MediaProvider بین نسخههای اندروید متفاوت است.
در اندروید ۱۰ و پایینتر، SDCardFS سیستم فایل بود و MediaProvider رابطی برای مجموعهای از فایلها (مثلاً تصاویر، ویدیوها، فایلهای موسیقی و غیره) فراهم میکرد. وقتی یک برنامه با استفاده از File API فایلی ایجاد میکرد، میتوانست از MediaProvider بخواهد که فایل را اسکن کرده و آن را در پایگاه داده ثبت کند.
در اندروید ۱۱ یا بالاتر، SDCardFS منسوخ شده و MediaProvider به عنوان کنترلکننده سیستم فایل (برای FUSE) برای حافظه خارجی تبدیل میشود و سیستم فایل روی حافظه خارجی و پایگاه داده MediaProvider را سازگار میکند. MediaProvider به عنوان کنترلکننده فضای کاربر برای سیستم فایل FUSE، میتواند فراخوانیهای هسته را رهگیری کرده و از ایمن بودن عملیات فایل از نظر حریم خصوصی اطمینان حاصل کند.
در اندروید ۱۱ و بالاتر، MediaProvider همچنین یک جزء سیستم ماژولار (یک ماژول Mainline) است که میتواند خارج از نسخههای اندروید بهروزرسانی شود. این بدان معناست که مشکلات عملکرد، حریم خصوصی یا امنیتی موجود در MediaProvider را میتوان برطرف کرد و از طریق فروشگاه Google Play یا سایر سازوکارهای ارائه شده توسط شرکا، به صورت بیسیم ارائه داد. هر چیزی که در محدوده آنچه از یک FUSE handler انتظار میرود، باشد نیز قابل بهروزرسانی است و بهروزرسانیها را برای رفع رگرسیونها و اشکالات عملکرد FUSE امکانپذیر میکند.