
Android תומך במכשירים עם אחסון מסורתי, שמוגדר בתור מערכת קבצים ללא תמיכה ברישיונות רגישים לרישיונות, עם סיווגים ומצבים של הרשאות POSIX בלתי ניתנים לשינוי. המונח 'אחסון מסורתי' כולל אחסון ממולא ואחסון נייד. אחסון נייד מוגדר כאחסון חיצוני שלא אומץ על ידי המערכת, ולכן לא עבר פורמט והצפנה או לא מקושר למכשיר ספציפי. אחסון חיצוני מסורתי מספק הגנה מינימלית על הנתונים המאוחסנים, ולכן אסור לאחסן מידע אישי רגיש בקוד המערכת באחסון חיצוני. באופן ספציפי, קובצי הגדרה וקובצי יומן צריכים להיות מאוחסנים רק באחסון הפנימי, שבו אפשר להגן עליהם בצורה יעילה.
אחסון חיצוני לכמה משתמשים
החל מגרסה 4.2 של Android, המכשירים יכולים לתמוך במספר משתמשים, והאחסון החיצוני צריך לעמוד באילוצים הבאים:
- לכל משתמש צריך להיות אחסון חיצוני ראשי מבודד משלו, ואסור לו להיות גישה לאחסון החיצוני הראשי של משתמשים אחרים.
- הנתיב
/sdcard
צריך להפנות לאחסון החיצוני הראשי הנכון שספציפי למשתמש, על סמך המשתמש שבו פועל התהליך. - כדי לשפר את הביצועים, יכול להיות שנפח האחסון של קובצי OBB גדולים בספרייה
Android/obb
ישותף בין כמה משתמשים. - אסור לאפליקציות לכתוב באחסון החיצוני המשני, מלבד בתיקיות ספציפיות לחבילות, כפי שמאפשרות ההרשאות המשולבות.
הטמעת ברירת המחדל של התכונה הזו בפלטפורמה משתמשת במרחבי שמות של ליבה של Linux כדי ליצור טבלאות טעינה מבודדות לכל תהליך שמתפצל מ-Zygote, ולאחר מכן משתמשת בטעינה מצורפת כדי להציע את האחסון החיצוני הראשי הנכון שספציפי למשתמש במרחב השמות הפרטי הזה.
בזמן האתחול, המערכת מטעינה דימוי של דימון FUSE לאחסון חיצוני ב-EMULATED_STORAGE_SOURCE
, שמוסתר מהאפליקציות. אחרי שה-Zygote מתפצל, הוא מחבר את ספריית המשנה המתאימה שספציפית למשתמש מתחת ל-daemon של FUSE אל EMULATED_STORAGE_TARGET
, כדי שנתיבי האחסון החיצוניים יתקבלו בצורה נכונה באפליקציה. מכיוון שאפליקציה לא כוללת נקודות טעינה נגישות לאחסון של משתמשים אחרים, היא יכולה לגשת רק לאחסון של המשתמש שבו היא הופעלה.
בהטמעה הזו נעשה שימוש גם בתכונה של ליבה של עץ משנה משותף כדי להפיץ אירועי קישור ממרחב השמות ברמה הבסיסית (root) שמוגדר כברירת מחדל למרחבי שמות של אפליקציות. כך מובטח שתכונות כמו קונטיינרים של ASEC וקישור של OBB ימשיכו לפעול בצורה תקינה. כדי לעשות זאת, המערכת מחברת את rootfs כמכשיר שיתופי, ואז מחברת אותו מחדש כמכשיר שפועל כעבד אחרי כל יצירת מרחב שמות של Zygote.
כמה מכשירי אחסון חיצוניים
החל מגרסה 4.4 של Android, למפתחים מוצגים כמה מכשירי אחסון חיצוניים דרך Context.getExternalFilesDirs()
, Context.getExternalCacheDirs()
ו-Context.getObbDirs()
.
ההרשאה WRITE_EXTERNAL_STORAGE
חייבת להעניק גישה לכתיבה רק לאחסון החיצוני הראשי במכשיר. אסור לאפליקציות לכתוב בהתקני אחסון חיצוניים משניים, מלבד בספריות הספציפיות לחבילה שלהן, כפי שמאפשרות ההרשאות המשולבות. הגבלת הכתיבה בדרך הזו מבטיחה שהמערכת תוכל לנקות קבצים כשאפליקציות יוסרו.
תמיכה במדיה ב-USB
ב-Android 6.0 יש תמיכה במכשירי אחסון ניידים שמחוברים למכשיר רק לזמן קצר, כמו כונני USB. כשמשתמש מחבר מכשיר נייד חדש, מוצגת בפלטפורמה התראה שמאפשרת לו להעתיק או לנהל את התוכן של המכשיר.
ב-Android 6.0, כל מכשיר שלא אומץ נחשב למכשיר נייד. מכיוון שהאחסון הנייד מחובר למשך זמן קצר בלבד, הפלטפורמה נמנעת מפעולות כבדות כמו סריקה של מדיה. אפליקציות צד שלישי חייבות לעבור דרך מסגרת הגישה לאחסון כדי לקיים אינטראקציה עם קבצים באחסון הנייד. הגישה הישירה חסומה במפורש מטעמי פרטיות ואבטחה.