אחסון בהיקף

אחסון בהיקף מגביל את הגישה לאפליקציה לאחסון חיצוני. ב-Android 11 ומעלה, אפליקציות המתמקדות ב-API 30 ומעלה חייבות להשתמש באחסון בהיקף. בעבר באנדרואיד 10, אפליקציות יכלו לבטל את הסכמתם לאחסון בהיקף.

הגבלות גישה לאפליקציה

המטרה של אחסון בהיקף היא להגן על הפרטיות של נתוני האפליקציה והמשתמשים. זה כולל הגנה על מידע משתמש (כגון מטא נתונים של תמונות), מניעת אפליקציות לשנות או למחוק קבצי משתמש ללא אישור מפורש, והגנה על מסמכי משתמש רגישים שהורדו להורדה או לתיקיות אחרות.

לאפליקציות המשתמשות באחסון בהיקף יכולות להיות רמות הגישה הבאות (הגישה בפועל היא ספציפית ליישום).

  • גישת קריאה וכתיבה לקבצים שלהם ללא הרשאות
  • גישת קריאה לקובצי מדיה של אפליקציות אחרות עם הרשאת READ_EXTERNAL_STORAGE
  • גישת כתיבה לקובצי מדיה של אפליקציות אחרות מותרת רק בהסכמת המשתמש הישירה (חריגים שניתנו לגלריית המערכת ולאפליקציות הכשירות לגישה לכל הקבצים)
  • אין גישת קריאה או כתיבה לספריות נתוני אפליקציות חיצוניות של אפליקציות אחרות

השתמש באחסון בהיקף עם FUSE

אנדרואיד 11 ומעלה תומך במערכת קבצים ב-Userspace (FUSE), המאפשרת למודול MediaProvider לבחון את פעולות הקבצים במרחב המשתמש ולהגדיר גישה לקבצים על סמך המדיניות כדי לאפשר , לדחות או לבטל גישה. אפליקציות באחסון בהיקף המשתמשות ב-FUSE מקבלים את תכונות הפרטיות של אחסון בהיקף ויכולת לגשת לקבצים באמצעות נתיב קובץ ישיר (לשמור על ממשקי API של קבצים עובדים באפליקציות).

אנדרואיד 10 אכפה כללי אחסון בהיקף על גישה לקבצים על ידי MediaProvider, אך לא עבור גישה ישירה לנתיב קבצים (לדוגמה, באמצעות ממשקי API של קבצים ו-NDK) עקב המאמץ הנדרש ביירוט קריאות ליבה. כתוצאה מכך, אפליקציות באחסון בהיקף לא יכלו לגשת לקבצים באמצעות נתיב קובץ ישיר. הגבלה זו השפיעה על יכולתם של מפתחי אפליקציות להסתגל מכיוון שהיא דרשה שינויי קוד מהותיים כדי לשכתב את גישת ה-File API ל-MediaProvider API.

FUSE ו-SDCardFS

התמיכה ב-Android 11 עבור FUSE אינה קשורה להוצאה משימוש של SDCardFS , אך מספקת חלופה ל-Media Store עבור מכשירים שהשתמשו בעבר ב-SDCardFS. מכשירים:

  • הפעלה עם אנדרואיד 11 ומעלה באמצעות ליבה 5.4 ומעלה לא יכולה להשתמש ב-SDCardFS.
  • שדרוג לאנדרואיד 11 ומעלה יכול לארח את FUSE על גבי SDCardFS כדי ליירט את פעולות הקבצים ולעמוד ביעדי הפרטיות.

כוונון ביצועי FUSE

אנדרואיד תמכה בעבר ב-FUSE באנדרואיד 7 ומטה, שבו הותקן אחסון חיצוני כ-FUSE. עקב בעיות ביצועים ומבוי סתום עם יישום FUSE זה, אנדרואיד 8 הציגה SDCardFS. אנדרואיד 11 מציגה מחדש תמיכה ב-FUSE באמצעות יישום משופר, בדוק יותר, של libfuse שניתן לכוונן כדי לפתור את בעיות הביצועים באנדרואיד 7 ומטה.

כוונון FUSE כולל את השינויים הבאים:

  • עקיפת FUSE עבור ספריות Android/data ו- Android/obb כדי לשפר את הביצועים עבור אפליקציות משחק המסתמכות על ספריות אלו.
  • אופטימיזציות (כגון כוונון הקריאה קדימה והיחס המלוכלך של מערכת הקבצים FUSE) כדי לשמור על ביצועי קריאה והשמעת מדיה חלקה.
  • שימוש במטמון הכתיבה חזרה של FUSE.
  • הרשאות שמירה במטמון להפחתת רכיבי IPC לשרת המערכת.
  • אופטימיזציות עבור אפליקציות עם גישה לכל הקבצים כדי להפוך פעולות בכמות גדולה יותר מהר יותר.

הכוונון הנ"ל יכול לייצר ביצועים דומים בין התקני FUSE למכשירים שאינם FUSE. לדוגמה, בדיקת Pixel 2 מכוון באמצעות FUSE ו-Pixel 2 באמצעות Media Store מצאה ביצועי קריאה רציפים דומים (לדוגמה, השמעת וידאו) בין גישה לנתיב קבצים ל-Media Store. עם זאת, כתיבה רציפה הייתה מעט גרועה יותר עם FUSE, והקריאה והכתיבה האקראית יכולה להיות אטית עד פי שניים.

מדידות הביצועים יכולות להשתנות ממכשיר למכשיר ובין מקרי שימוש ספציפיים. מכיוון שממשקי ה-API של MediaProvider מספקים את הביצועים העקבים ביותר, מפתחי אפליקציות שמודאגים לגבי ביצועים צריכים להשתמש בממשקי MediaProvider API עבור האפליקציות שלהם.

צמצם את השפעת הביצועים של FUSE

השפעת הביצועים של FUSE מוגבלת למשתמשים כבדים של קבצים המאוחסנים באחסון משותף חיצוני בלבד. אחסון פרטי חיצוני (הכולל ספריות android/data ו- android/obb ) עוקף על ידי FUSE, בעוד שאחסון פנימי (כגון /data/data , שבו יישומים רבים מאחסנים נתונים כדי לשמור אותם מוצפנים ומאובטחים) אינו מותקן ב-FUSE.

  • אפליקציות שהן משתמשות קלות באחסון חיצוני משותף מקיימות לעתים קרובות אינטראקציה עם קבוצה מוגבלת של קבצים (בדרך כלל פחות מ-100 קבצים). אפליקציות אלה נהנות מאופטימיזציות קיימות של פעולות קריאה וכתיבה נפוצות ולא אמורות לראות שום השפעה על ביצועים הקשורה ל-FUSE באנדרואיד 11.

  • אפליקציות שהן משתמשות כבדות באחסון חיצוני משותף מבצעות בדרך כלל פעולות קבצים בכמות גדולה, כגון רישום או הסרה של ספרייה עם 1000 קבצים, או יצירה או מחיקה של ספרייה עם מיליון קבצים במערכת הקבצים. פעולות קבצים בכמות גדולה עשויות להיות מושפעות על ידי FUSE ב-Android 11, אבל אם אפליקציות כאלה זכאיות להרשאת MANAGE_EXTERNAL_STORAGE , הם נהנים מהאופטימיזציות של הביצועים הכלולות בעדכון אוקטובר 2020.

כדי למנוע תקורה של ביצועי FUSE, אפליקציות יכולות לאחסן נתונים באחסון פרטי חיצוני או להשתמש בממשקי API בכמות גדולה במחלקת ContentProvider כדי לעקוף את FUSE ולקבל נתיב מותאם לביצועים. בנוסף, העדכון של אוקטובר 2020 לרכיב המערכת MediaProvider כולל אופטימיזציות של ביצועים עבור מנהלי קבצים ואפליקציות דומות (כגון גיבוי/שחזור, אנטי וירוס) שמחזיקות בהרשאת MANAGE_EXTERNAL_STORAGE .

פרטיות על פני ביצועים

במכשירים שכוונו ל-FUSE, רוב מסעות המשתמש הקריטיים מתפקדים באותה מידה בין אנדרואיד 10 לאנדרואיד 11. עם זאת, כאשר בודקים אמות מידה על קבוצה של פעולות קבצים, אנדרואיד 11 עשויה לבצע ביצועים גרועים יותר מאנדרואיד 10. עבור דפוסי גישה לקבצים עם ביצועים גרוע יותר באנדרואיד 11 (לדוגמה, קריאה או כתיבה אקראית), אנו ממליצים להשתמש בממשקי MediaProvider API כדי לתת לאפליקציות מצב גישה ללא FUSE, שזו האפשרות הטובה ביותר ובעלת ביצועים עקביים.

עדכוני MediaProvider ו-FUSE

התנהגות רכיבי המערכת של MediaProvider שונה בין גרסאות אנדרואיד.

  • באנדרואיד 10 ומטה, SDCardFS הייתה מערכת הקבצים ו-MediaProvider סיפקה ממשק לאוספי קבצים (לדוגמה, תמונות, סרטונים, קובצי מוזיקה וכו'). כאשר אפליקציה יצרה קובץ באמצעות File API, היא יכולה לבקש מ-MediaProvider לסרוק את הקובץ ולהקליט אותו במסד הנתונים.

  • באנדרואיד 11 ומעלה, SDCardFS הוצא משימוש ו-MediaProvider הופך למטפל במערכת הקבצים (עבור FUSE) לאחסון חיצוני, מה שהופך את מערכת הקבצים באחסון חיצוני ואת מסד הנתונים של MediaProvider לעקבי. כמטפל במרחב המשתמש של מערכת הקבצים FUSE, MediaProvider יכול ליירט קריאות ליבה ולהבטיח שפעולות הקבצים בטוחות בפרטיות.

באנדרואיד 11 ומעלה, MediaProvider הוא גם רכיב מערכת מודולרי (מודול Mainline) שניתן לעדכן מחוץ לגרסת אנדרואיד. המשמעות היא שניתן לתקן בעיות ביצועים, פרטיות או אבטחה שנמצאות ב-MediaProvider ולהעביר אותן באוויר מחנות Google Play או מנגנונים אחרים שסופקו על ידי שותף. כל דבר בהיקף של מה שמצופה ממטפל FUSE ניתן גם לעדכן, מה שמאפשר עדכונים לתקן רגרסיות ובאגים של ביצועי FUSE.