מערכת Android משתמשת במערכת קבצים שדומה למערכות קבצים מבוססות-דיסק בפלטפורמות אחרות. המערכת מספקת כמה אפשרויות לשמירת נתוני האפליקציה:
- אחסון ספציפי לאפליקציה: אחסון קבצים שמיועדים לשימוש האפליקציה בלבד, בספריות ייעודיות בנפח אחסון פנימי או בספריות ייעודיות שונות באחסון חיצוני. כדאי להשתמש בספריות באחסון הפנימי כדי לשמור מידע רגיש שאפליקציות אחרות לא אמורות לגשת אליו.
- אחסון משותף: אחסון של קבצים שהאפליקציה מתכוונת לשתף עם אפליקציות אחרות, כולל מדיה, מסמכים וקבצים אחרים.
- העדפות: אחסון של נתונים פרימיטיביים פרטיים בצמדי מפתח-ערך.
- מסדי נתונים: אחסון נתונים מובְנים במסד נתונים פרטי באמצעות ספריית Room persistence.
המאפיינים של האפשרויות האלה מסוכמים בטבלה הבאה:
| סוג התוכן | שיטת הגישה | נדרשות הרשאות | האם אפליקציות אחרות יכולות לגשת? | האם קבצים מוסרים כשמסירים את האפליקציה? | |
|---|---|---|---|---|---|
| קבצים ספציפיים לאפליקציה | קבצים שמיועדים לשימוש באפליקציה בלבד | מהאחסון הפנימי, getFilesDir() או
getCacheDir()מהאחסון החיצוני, getExternalFilesDir() או
getExternalCacheDir() |
לא נדרשת אף פעם לאחסון פנימי לא נדרשת לאחסון חיצוני כשהאפליקציה בשימוש במכשירים עם Android 4.4 (רמת API 19) ומעלה |
לא | כן |
| מדיה | קבצי מדיה שאפשר לשתף (תמונות, קובצי אודיו, סרטונים) | MediaStore API |
READ_EXTERNAL_STORAGE כשניגשים לקבצים של אפליקציות אחרות ב-Android 11 (רמת API 30) ומעלה READ_EXTERNAL_STORAGE או WRITE_EXTERNAL_STORAGE
כשניגשים לקבצים של אפליקציות אחרות ב-Android 10 (רמת API 29) נדרשות הרשאות לכל הקבצים ב-Android 9 (רמת API 28) ומטה |
כן, אבל לאפליקציה השנייה נדרשת ההרשאה READ_EXTERNAL_STORAGE
|
לא |
| מסמכים וקבצים אחרים | סוגים אחרים של תוכן שאפשר לשתף, כולל קבצים שהורדתם | Storage Access Framework | ללא | כן, באמצעות הכלי לבחירת קבצים של המערכת | לא |
| העדפות אפליקציה | צמדים של מפתח/ערך | ספריית Jetpack Preferences | ללא | לא | כן |
| מסד נתונים | נתונים מובנים | ספריית Room persistence | ללא | לא | כן |
הפתרון שתבחרו תלוי בצרכים הספציפיים שלכם:
- כמה נפח אחסון נדרש לנתונים?
- יש מקום מוגבל באחסון הפנימי לנתונים ספציפיים לאפליקציות. אם אתם צריכים לשמור כמות גדולה של נתונים, כדאי להשתמש בסוגים אחרים של אחסון.
- מהי רמת המהימנות הנדרשת לגישה לנתונים?
- אם הפונקציונליות הבסיסית של האפליקציה דורשת נתונים מסוימים, למשל כשהאפליקציה מופעלת, צריך למקם את הנתונים בספריית האחסון הפנימי או במסד נתונים. לא תמיד יש גישה לקבצים ספציפיים לאפליקציה שמאוחסנים באחסון חיצוני, כי חלק מהמכשירים מאפשרים למשתמשים להסיר מכשיר פיזי שתואם לאחסון חיצוני.
- איזה סוג נתונים צריך לאחסן?
- אם יש לכם נתונים שרלוונטיים רק לאפליקציה שלכם, השתמשו באחסון ספציפי לאפליקציה. כדי לשתף תוכן מדיה, צריך להשתמש ב-Shared Storage כדי שאפליקציות אחרות יוכלו לגשת לתוכן. לנתונים מובְנים, אפשר להשתמש בהעדפות (לנתוני מפתח/ערך) או במסד נתונים (לנתונים שמכילים יותר מ-2 עמודות).
- האם הנתונים צריכים להיות פרטיים לאפליקציה שלכם?
- כשמאחסנים נתונים רגישים – נתונים שלא אמורה להיות אליהם גישה מאף אפליקציה אחרת – צריך להשתמש באחסון פנימי, בהעדפות או במסד נתונים. היתרון הנוסף של האחסון הפנימי הוא שהנתונים מוסתרים מהמשתמשים.
קטגוריות של מיקומי אחסון
ב-Android יש שני סוגים של מיקומי אחסון פיזיים: אחסון פנימי ואחסון חיצוני. ברוב המכשירים, האחסון הפנימי קטן יותר מהאחסון החיצוני. עם זאת, האחסון הפנימי תמיד זמין בכל המכשירים, ולכן הוא מקום אמין יותר לאחסון נתונים שהאפליקציה שלכם מסתמכת עליהם.
כרכים נשלפים, כמו כרטיס SD, מופיעים במערכת הקבצים כחלק מהאחסון החיצוני. ב-Android, המכשירים האלה מיוצגים באמצעות נתיב, כמו
/sdcard.
כברירת מחדל, האפליקציות עצמן מאוחסנות באחסון הפנימי. עם זאת, אם גודל ה-APK גדול מאוד, אפשר לציין העדפה בקובץ המניפסט של האפליקציה להתקנת האפליקציה באחסון חיצוני:
<manifest ... android:installLocation="preferExternal"> ... </manifest>
הרשאות וגישה לאחסון חיצוני
מערכת Android מגדירה את ההרשאות הבאות שקשורות לאחסון:
READ_EXTERNAL_STORAGE,
WRITE_EXTERNAL_STORAGE,
ו-
MANAGE_EXTERNAL_STORAGE.
בגרסאות קודמות של Android, אפליקציות נדרשו להצהיר על ההרשאה READ_EXTERNAL_STORAGE כדי לגשת לכל קובץ מחוץ לספריות הספציפיות לאפליקציה באחסון החיצוני.
בנוסף, האפליקציות נדרשו להצהיר על ההרשאה WRITE_EXTERNAL_STORAGE כדי לכתוב לכל קובץ מחוץ לספרייה הספציפית לאפליקציה.
בגרסאות חדשות יותר של Android, כדי לקבוע את היכולת של אפליקציה לגשת לקובץ מסוים ולכתוב בו, המערכת מסתמכת יותר על המטרה של הקובץ מאשר על המיקום שלו. במיוחד, אם האפליקציה מטרגטת ל-Android 11 (רמת API 30) או לגרסאות מתקדמות יותר, להרשאה WRITE_EXTERNAL_STORAGE אין השפעה על הגישה של האפליקציה לאחסון. מודל האחסון הזה, שמבוסס על ייעוד, משפר את הפרטיות של המשתמשים כי האפליקציות מקבלות גישה רק לאזורים במערכת הקבצים של המכשיר שבהם הן משתמשות בפועל.
ב-Android 11 הוצגה ההרשאה MANAGE_EXTERNAL_STORAGE, שמאפשרת גישת כתיבה לקבצים מחוץ לספרייה הספציפית לאפליקציה ול-MediaStore. כדי לקבל מידע נוסף על ההרשאה הזו ולמה רוב האפליקציות לא צריכות להצהיר עליה כדי למלא את תרחישי השימוש שלהן, אפשר לעיין במדריך בנושא ניהול כל הקבצים בהתקן אחסון.
נפח אחסון ייעודי לאפליקציות
כדי לתת למשתמשים יותר שליטה בקבצים שלהם ולהגביל את העומס בקבצים, אפליקציות שמטרגטות את Android 10 (רמת API 29) ומעלה מקבלות כברירת מחדל גישה מוגבלת לאחסון חיצוני, או אחסון ייעודי לאפליקציות. לאפליקציות כאלה יש גישה רק לספרייה הספציפית לאפליקציה באחסון החיצוני, וגם לסוגים ספציפיים של מדיה שהאפליקציה יצרה.
מומלץ להשתמש בנפח אחסון ייעודי לאפליקציות, אלא אם האפליקציה צריכה גישה לקובץ שמאוחסן מחוץ לספרייה ספציפית לאפליקציה ומחוץ לספרייה שאליה יש ל-API של MediaStore גישה. אם אתם מאחסנים קבצים ספציפיים לאפליקציה בהתקן אחסון חיצוני, תוכלו להקל על המעבר לנפח אחסון ייעודי לאפליקציות על ידי הצבת הקבצים האלה בספרייה ספציפית לאפליקציה בהתקן אחסון חיצוני. כך האפליקציה שלכם שומרת על הגישה לקבצים האלה כשהאחסון המוגבל מופעל.
כדי להכין את האפליקציה לנפח אחסון ייעודי לאפליקציות, כדאי לעיין במדריך תרחישי שימוש ושיטות מומלצות בנוגע לאחסון. אם יש לאפליקציה שלכם תרחיש שימוש אחר שלא מכוסה על ידי נפח אחסון ייעודי לאפליקציות, הגשת בקשה להוספת תכונה. אתם יכולים לבטל באופן זמני את השימוש באחסון בהיקף מוגבל.
הצגת קבצים במכשיר
כדי להציג את הקבצים שמאוחסנים במכשיר, משתמשים בסייר הקבצים במכשיר של Android Studio.
מקורות מידע נוספים
למידע נוסף על אחסון נתונים, אפשר לעיין במקורות המידע הבאים.