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

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

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

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

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

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

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

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

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

FUSE ו-SDCardFS

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

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

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

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

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

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

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

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

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

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

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

  • אפליקציות שמשתמשות הרבה באחסון חיצוני משותף בדרך כלל מבצעות פעולות בכמות גדולה של קבצים, כמו הצגה או הסרה של ספרייה עם 1,000 קבצים, או יצירה או מחיקה של ספרייה עם מיליון קבצים במערכת הקבצים. יכול להיות שפעולות על קבצים בכמות גדולה יושפעו מ-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. לדפוסי גישה לקבצים שפועלים בצורה פחות טובה ב-Android 11 (לדוגמה, קריאות או כתיבות אקראיות), מומלץ להשתמש בממשקי API של MediaProvider כדי לתת לאפליקציות מצב גישה שאינו FUSE, שהוא האפשרות הטובה ביותר עם ביצועים עקביים.

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

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

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

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

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