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