נפח אחסון ייעודי לאפליקציות

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

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

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

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

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

שימוש באחסון מוגבל באמצעות FUSE

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

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

FUSE ו-SDCardFS

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

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

כוונון הביצועים של FUSE

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

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

  • עקיפת FUSE בתיקיות Android/data ו-Android/obb כדי לשפר את הביצועים של אפליקציות משחקים שמסתמכות על התיקיות האלה.
  • אופטימיזציות (כמו שינוי היחסים של קריאה מראש ויחסים מלוכלכים במערכת הקבצים של FUSE) כדי לשמור על ביצועי קריאה טובים ועל הפעלה חלקה של מדיה.
  • שימוש במטמון הכתיבה החוזרת של FUSE.
  • שמירת הרשאות במטמון כדי לצמצם את מספר הבקשות ל-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.

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

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

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

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

עדכונים ל-MediaProvider ול-FUSE

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

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

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

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