ב-Android נעשה שימוש במערכת קבצים שדומה למערכות קבצים שמבוססות על דיסקים בפלטפורמות אחרות. המערכת מספקת כמה אפשרויות לשמירת נתוני האפליקציה:
- אחסון ייעודי לאפליקציה: אחסון קבצים שמיועדים לשימוש באפליקציה בלבד, בספריות ייעודיות בנפח אחסון פנימי או בספריות ייעודיות אחרות בנפח אחסון חיצוני. אפשר להשתמש בספריות שבאחסון הפנימי כדי לשמור מידע רגיש שאפליקציות אחרות לא צריכות לגשת אליו.
- אחסון שיתופי: אחסון קבצים שהאפליקציה שלכם מתכוונת לשתף עם אפליקציות אחרות, כולל מדיה, מסמכים וקבצים אחרים.
- העדפות: אחסון נתונים פרטיים ופשוטים בזוגות של מפתח/ערך.
- מסדי נתונים: אחסון נתונים מובְנים במסד נתונים פרטי באמצעות ספריית הקביעות של Room.
המאפיינים של האפשרויות האלה מפורטים בטבלה הבאה:
סוג התוכן | שיטת הגישה | נדרשות הרשאות | האם אפליקציות אחרות יכולות לגשת אליו? | קבצים שהוסרו במהלך הסרת האפליקציה? | |
---|---|---|---|---|---|
קבצים ספציפיים לאפליקציה | קבצים שמיועדים לשימוש באפליקציה בלבד | מהאחסון הפנימי, 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 | ללא | לא | כן |
הפתרון שתבחרו תלוי בצרכים הספציפיים שלכם:
- כמה מקום נדרש לנתונים שלכם?
- נפח האחסון הפנימי מוגבל לנתונים ספציפיים לאפליקציה. אם אתם צריכים לשמור כמות גדולה של נתונים, כדאי להשתמש בסוגים אחרים של אחסון.
- עד כמה הגישה לנתונים צריכה להיות מהימנה?
- אם הפונקציונליות הבסיסית של האפליקציה דורשת נתונים מסוימים, למשל כשהאפליקציה מופעלת, צריך להציב את הנתונים בספריית האחסון הפנימי או במסד נתונים. לא תמיד אפשר לגשת לקבצים ספציפיים לאפליקציה שמאוחסנים באחסון חיצוני, כי במכשירים מסוימים המשתמשים יכולים להסיר התקן פיזי שתואם לאחסון החיצוני.
- איזה סוג נתונים אתם צריכים לאחסן?
- אם יש לכם נתונים שמשמעותיים רק לאפליקציה, השתמשו באחסון ייעודי לאפליקציה. תוכן מדיה שאפשר לשתף צריך להיות באחסון שיתופי כדי שאפליקציות אחרות יוכלו לגשת אליו. לנתונים מובְנים, משתמשים בהעדפות (לנתונים מסוג מפתח-ערך) או במסד נתונים (לנתונים שמכילים יותר מ-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
. אם אתם מאחסנים קבצים ספציפיים לאפליקציה באחסון חיצוני, תוכלו להקל על המעבר לאחסון מוגבל על ידי הצבתם בספרייה ספציפית לאפליקציה באחסון חיצוני. כך האפליקציה תמשיך לגשת לקבצים האלה כשאחסון מוגבל להיקף מופעל.
כדי להכין את האפליקציה לשימוש באחסון מוגבל, כדאי לעיין במדריך בנושא תרחישים לדוגמה ושיטות מומלצות לגישה לאחסון. אם יש לאפליקציה שלכם תרחיש שימוש נוסף שלא מכוסה על ידי אחסון מוגבל, שלחו בקשה להוספת תכונה. אתם יכולים לבטל באופן זמני את השימוש באחסון מוגבל.
הצגת קבצים במכשיר
כדי להציג את הקבצים ששמורים במכשיר, משתמשים בDevice File Explorer של Android Studio.
מקורות מידע נוספים
למידע נוסף על אחסון נתונים, אפשר לעיין במקורות המידע הבאים.