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

נפח האחסון הייעודי לאפליקציות מגביל את הגישה של האפליקציה לאחסון חיצוני. ב-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. בגלל בעיות בביצועים ובקיפאון (deadlock) בהטמעה של 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, וקריאות וכתיבות אקראיות היו יכולות להיות איטיות פי שניים.

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

צמצום ההשפעה של 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 או ממנגנונים אחרים שסופקו על ידי שותפים. אפשר לעדכן כל דבר במסגרת מה שמצופה מ-handler של FUSE, וכך לתקן באגים ולשפר את הביצועים של FUSE.