فضای ذخیره سازی محدوده

فضای ذخیره سازی محدوده دسترسی برنامه به حافظه خارجی را محدود می کند. در Android 11 یا بالاتر، برنامه‌هایی که API 30 یا بالاتر را هدف قرار می‌دهند باید از فضای ذخیره‌سازی محدوده استفاده کنند. پیش از این در اندروید 10، برنامه‌ها می‌توانستند از فضای ذخیره‌سازی محدوده خودداری کنند.

محدودیت های دسترسی به برنامه

هدف از فضای ذخیره سازی محدوده محافظت از حریم خصوصی برنامه و داده های کاربر است. این شامل محافظت از اطلاعات کاربر (مانند فراداده عکس)، جلوگیری از تغییر یا حذف برنامه‌ها فایل‌های کاربر بدون اجازه صریح، و محافظت از اسناد حساس کاربر دانلود شده در دانلود یا پوشه‌های دیگر است.

برنامه‌هایی که از فضای ذخیره‌سازی دامنه‌دار استفاده می‌کنند، می‌توانند سطوح دسترسی زیر را داشته باشند (دسترسی واقعی مختص پیاده‌سازی است).

  • خواندن و نوشتن دسترسی به فایل های خود را بدون مجوز
  • دسترسی خواندن به فایل‌های رسانه دیگر برنامه‌ها با مجوز READ_EXTERNAL_STORAGE
  • دسترسی نوشتن به فایل‌های رسانه‌ای دیگر برنامه‌ها فقط با رضایت مستقیم کاربر مجاز است (استثناهایی که به گالری سیستم و برنامه‌هایی که واجد شرایط دسترسی به همه فایل‌ها هستند اعطا می‌شود)
  • دسترسی خواندن یا نوشتن به فهرست‌های اطلاعات برنامه‌های خارجی دیگر برنامه‌ها وجود ندارد

از فضای ذخیره‌سازی محدوده با FUSE استفاده کنید

Android 11 یا بالاتر از Filesystem in Userspace (FUSE) پشتیبانی می‌کند، که ماژول MediaProvider را قادر می‌سازد تا عملیات فایل را در فضای کاربر بررسی کند و بر اساس خط‌مشی اجازه دادن ، رد کردن ، یا ویرایش کردن دسترسی به فایل‌ها را گیت کند. برنامه‌های موجود در فضای ذخیره‌سازی محدوده‌ای که از FUSE استفاده می‌کنند، ویژگی‌های حریم خصوصی فضای ذخیره‌سازی دامنه‌دار و توانایی دسترسی به فایل‌ها را با استفاده از مسیر فایل مستقیم (به کار نگه داشتن APIهای فایل در برنامه‌ها) دریافت می‌کنند.

Android 10 قوانین فضای ذخیره‌سازی دامنه‌ای را برای دسترسی به فایل‌ها توسط MediaProvider اعمال می‌کند، اما نه برای دسترسی مستقیم به مسیر فایل (مثلاً استفاده از File API و NDK API) به دلیل تلاشی که برای رهگیری تماس‌های هسته لازم است. در نتیجه، برنامه‌های موجود در فضای ذخیره‌سازی محدوده نمی‌توانند با استفاده از مسیر فایل مستقیم به فایل‌ها دسترسی پیدا کنند. این محدودیت بر توانایی توسعه دهندگان برنامه برای تطبیق تأثیر گذاشت زیرا به تغییرات اساسی کد برای بازنویسی دسترسی File API به MediaProvider API نیاز داشت.

FUSE و SDCardFS

پشتیبانی Android 11 از FUSE با منسوخ شدن SDCardFS ارتباطی ندارد، اما جایگزینی برای Media Store برای دستگاه‌هایی که قبلا از SDCardFS استفاده می‌کردند، ارائه می‌کند. دستگاه ها:

  • راه اندازی با Android 11 یا بالاتر با استفاده از هسته 5.4 یا بالاتر نمی تواند از SDCardFS استفاده کند.
  • ارتقاء به Android 11 یا بالاتر می‌تواند FUSE را در بالای SDCardFS میزبانی کند تا عملیات فایل را متوقف کند و اهداف حریم خصوصی را برآورده کند.

تنظیم عملکرد فیوز

اندروید قبلاً از FUSE در اندروید 7 یا پایین‌تر پشتیبانی می‌کرد که در آن حافظه خارجی به صورت FUSE نصب شده بود. با توجه به عملکرد و مشکلات بن بست در پیاده سازی FUSE، اندروید 8 SDCardFS را معرفی کرد. Android 11 با استفاده از یک پیاده‌سازی بهبودیافته و آزمایش‌شده libfuse که می‌تواند برای حل مشکلات عملکرد در اندروید ۷ یا پایین‌تر تنظیم شود، پشتیبانی از FUSE را مجدداً معرفی می‌کند.

تنظیم FUSE شامل ترفندهای زیر است:

  • دور زدن FUSE برای فهرست‌های Android/data و Android/obb برای بهبود عملکرد برنامه‌های بازی که به این فهرست‌ها متکی هستند.
  • بهینه‌سازی‌ها (مانند تنظیم نسبت‌های پیشخوان و کثیف سیستم فایل FUSE) برای حفظ عملکرد خواندن و پخش رسانه روان.
  • استفاده از حافظه پنهان FUSE-back-back.
  • ذخیره کردن مجوزها برای کاهش IPCها به سرور سیستم.
  • بهینه‌سازی برای برنامه‌های دارای دسترسی به همه فایل‌ها برای سریع‌تر کردن عملیات انبوه.

ترفندهای تنظیم فوق می توانند عملکرد قابل مقایسه ای را بین دستگاه های 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 نصب نشده است.

  • برنامه هایی که کاربران سبک حافظه خارجی مشترک هستند، اغلب با مجموعه محدودی از فایل ها (معمولاً کمتر از 100 فایل) تعامل دارند. این برنامه‌ها از بهینه‌سازی‌های موجود در عملیات خواندن و نوشتن معمولی بهره می‌برند و نباید تأثیر عملکرد مرتبط با FUSE را در Android 11 ببینند.

  • برنامه‌هایی که کاربران سنگین ذخیره‌سازی خارجی مشترک هستند، معمولاً عملیات فایل‌های انبوه را انجام می‌دهند، مانند فهرست کردن یا حذف فهرستی با 1000 فایل، یا ایجاد یا حذف فهرستی با میلیون‌ها فایل در سیستم فایل. عملیات فایل انبوه ممکن است تحت تأثیر FUSE در Android 11 قرار گیرد، اما اگر چنین برنامه‌هایی واجد شرایط مجوز MANAGE_EXTERNAL_STORAGE باشند، از بهینه‌سازی عملکرد موجود در به‌روزرسانی اکتبر 2020 بهره می‌برند.

برای جلوگیری از سربار عملکرد FUSE، برنامه‌ها می‌توانند داده‌ها را در فضای ذخیره‌سازی خصوصی خارجی ذخیره کنند یا از APIهای انبوه در کلاس ContentProvider برای دور زدن FUSE و دریافت یک مسیر بهینه‌سازی عملکرد استفاده کنند. علاوه بر این، به‌روزرسانی اکتبر 2020 مؤلفه سیستم MediaProvider شامل بهینه‌سازی عملکرد برای مدیران فایل و برنامه‌های مشابه (مانند پشتیبان‌گیری/بازیابی، آنتی‌ویروس) است که مجوز MANAGE_EXTERNAL_STORAGE را دارند.

حریم خصوصی بر عملکرد

در دستگاه‌هایی که برای FUSE تنظیم شده‌اند، اکثر سفرهای حیاتی کاربر بین Android 10 و Android 11 به یکسان عمل می‌کنند. با این حال، هنگام آزمایش معیارها بر روی مجموعه‌ای از عملیات فایل، ممکن است Android 11 بدتر از Android 10 عمل کند. برای الگوهای دسترسی به فایل که کارایی دارند. بدتر از آن در اندروید 11 (به عنوان مثال، خواندن یا نوشتن تصادفی)، توصیه می کنیم از API های MediaProvider برای دادن حالت دسترسی غیر FUSE به برنامه ها استفاده کنید، که بهترین و کارآمدترین گزینه است.

به روز رسانی MediaProvider و FUSE

رفتار جزء سیستم MediaProvider بین نسخه‌های اندرویدی متفاوت است.

  • در اندروید 10 و پایین‌تر، SDCardFS سیستم فایل بود و MediaProvider یک رابط برای مجموعه‌ای از فایل‌ها (به عنوان مثال، تصاویر، ویدیوها، فایل‌های موسیقی و غیره) ارائه می‌کرد. هنگامی که یک برنامه با استفاده از File API فایلی ایجاد می‌کند، می‌تواند از MediaProvider بخواهد که فایل را اسکن کرده و آن را در پایگاه داده ثبت کند.

  • در Android 11 یا بالاتر، SDCardFS منسوخ شده است و MediaProvider به کنترل‌کننده سیستم فایل (برای FUSE) برای ذخیره‌سازی خارجی تبدیل می‌شود، که باعث می‌شود سیستم فایل در حافظه خارجی و پایگاه داده MediaProvider سازگار باشد. MediaProvider به‌عنوان کنترل‌کننده فضای کاربر برای سیستم فایل FUSE، می‌تواند تماس‌های هسته را رهگیری کند و از امنیت عملیات فایل مطمئن شود.

در اندروید 11 و بالاتر، MediaProvider نیز یک جزء سیستم مدولار (یک ماژول Mainline) است که می‌تواند خارج از نسخه‌های اندروید به‌روزرسانی شود. این به این معنی است که مشکلات مربوط به عملکرد، حریم خصوصی یا امنیتی موجود در MediaProvider را می‌توان برطرف کرد و از طریق فروشگاه Google Play یا سایر مکانیسم‌های ارائه‌شده توسط شریک، از طریق هوا ارائه شد. هر چیزی در محدوده آنچه از یک FUSE handler انتظار می رود نیز قابل به روز رسانی است و به روز رسانی ها را قادر می سازد تا رگرسیون ها و اشکالات عملکرد FUSE را برطرف کنند.