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

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

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

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

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

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

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

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

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

FUSE و SDCardFS

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

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

تنظیم عملکرد FUSE

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

تنظیم FUSE شامل تغییرات زیر است:

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

تنظیمات دقیق بالا می‌تواند عملکرد قابل‌مقایسه‌ای بین دستگاه‌های FUSE و غیرFUSE ایجاد کند. برای مثال، آزمایش Pixel 2 تنظیم‌شده بااستفاده از FUSE و Pixel 2 بااستفاده از «فضای ذخیره‌سازی رسانه‌ها» نشان داد که عملکرد خواندن ترتیبی (برای مثال، بازپخش ویدیو) بین دسترسی به مسیر فایل و «فضای ذخیره‌سازی رسانه‌ها» قابل‌مقایسه است. بااین‌حال، نوشتن‌های ترتیبی با FUSE کمی بدتر بود و خواندن و نوشتن تصادفی می‌توانست تا دو برابر کندتر باشد.

اندازه‌گیری‌های عملکرد می‌تواند از دستگاهی به دستگاه دیگر و بین موارد استفاده خاص متفاوت باشد. چون API-های MediaProvider سازگارترین عملکرد را ارائه می‌دهند، توسعه‌دهندگان برنامه‌ای که نگران عملکرد هستند باید از API-های MediaProvider برای برنامه‌هایشان استفاده کنند.

کاهش تأثیر عملکرد FUSE

تأثیر عملکرد FUSE فقط به کاربران سنگین فایل‌های ذخیره‌شده در فضای ذخیره‌سازی مشترک خارجی محدود می‌شود. فضای ذخیره‌سازی خصوصی خارجی (که شامل android/data و android/obb دایرکتوری می‌شود) توسط FUSE دور زده می‌شود، درحالی‌که فضای ذخیره‌سازی داخلی (مثل /data/data، که بسیاری از برنامه‌ها داده‌ها را در آن ذخیره می‌کنند تا رمزگذاری‌شده و ایمن بماند) توسط FUSE نصب نمی‌شود.

  • برنامه‌هایی که از فضای ذخیره‌سازی خارجی مشترک به‌صورت سبک استفاده می‌کنند اغلب با مجموعه محدودی از فایل‌ها (معمولاً کمتر از ۱۰۰ فایل) تعامل دارند. این برنامه‌ها از بهینه‌سازی‌های موجود برای عملیات خواندن و نوشتن مشترک بهره‌مند می‌شوند و نباید هیچ‌گونه تأثیر عملکردی مرتبط با FUSE در Android 11 داشته باشند.

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

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

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

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

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

عملکرد جزء سیستم MediaProvider در نسخه‌های مختلف Android متفاوت است.

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

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

در Android نسخه ۱۱ و بالاتر، MediaProvider همچنین یک مؤلفه سیستم مدولار (یک مدول Mainline) است که می‌تواند خارج از نسخه‌های Android به‌روز شود. این یعنی مشکلات عملکرد، حریم خصوصی، یا امنیتی که در MediaProvider پیدا می‌شود می‌تواند ازطریق «فروشگاه Google Play» یا دیگر سازوکارهای ارائه‌شده توسط شریک به‌صورت بی‌سیم برطرف و ارائه شود. هر چیزی که در محدوده انتظارات از یک مدیر FUSE باشد نیز قابل به‌روزرسانی است، که امکان به‌روزرسانی برای رفع اشکالات و افت عملکرد FUSE را فراهم می‌کند.