אִחסוּן

סמל HAL לאחסון חיצוני של אנדרואיד

אנדרואיד התפתחה עם הזמן כדי לתמוך במגוון רחב של סוגים ותכונות של התקני אחסון. כל הגרסאות של אנדרואיד תומכות במכשירים עם אחסון מסורתי , הכולל אחסון נייד וחיקוי. ניתן לספק אחסון נייד באמצעות מדיה פיזית, כמו כרטיס SD או USB, כלומר להעברת נתונים/אחסון קבצים זמניים. המדיה הפיזית עשויה להישאר עם המכשיר לפרק זמן ממושך, אך אינה קשורה למכשיר וייתכן שיוסרו. כרטיסי SD זמינים כאחסון נייד מאז אנדרואיד 1.0; אנדרואיד 6.0 הוסיפה תמיכה ב-USB. אחסון אמולציה מסופק על ידי חשיפת חלק מהאחסון הפנימי באמצעות שכבת אמולציה והוא זמין מאז אנדרואיד 3.0.

החל מ-Android 6.0, אנדרואיד תומך באחסון ניתן לאימוץ , שמסופק על ידי מדיה פיזית, כמו כרטיס SD או USB, המוצפן ומעוצב כך שינהג כמו אחסון פנימי. אחסון ניתן לאמץ יכול לאחסן את כל סוגי נתוני האפליקציה.

הרשאות

הגישה לאחסון חיצוני מוגנת על ידי הרשאות Android שונות. החל מ-Android 1.0, גישת הכתיבה מוגנת עם הרשאת WRITE_EXTERNAL_STORAGE . החל מ-Android 4.1, גישת הקריאה מוגנת עם הרשאת READ_EXTERNAL_STORAGE .

החל מאנדרואיד 4.4, הבעלים, הקבוצה והמצבים של קבצים בהתקני אחסון חיצוניים מסונתזים כעת על סמך מבנה הספריות. זה מאפשר לאפליקציות לנהל את הספריות הספציפיות לחבילות שלהן באחסון חיצוני מבלי להידרש להן הרשאת WRITE_EXTERNAL_STORAGE הרחבה. לדוגמה, האפליקציה עם שם החבילה com.example.foo יכולה כעת לגשת באופן חופשי ל- Android/data/com.example.foo/ בהתקני אחסון חיצוניים ללא הרשאות. הרשאות מסונתזות אלו מבוצעות על ידי עטיפת התקני אחסון גולמיים בדמון FUSE.

החל מ-Android 10, אפליקציות המכוונות לאנדרואיד 9 ומטה ברירת המחדל לאחסון מדור קודם, ויכולות להצטרף לאחסון מבודד. אפליקציות המכוונות לאנדרואיד 10 ובברירת מחדל לאחסון מבודד יכולות לבטל את הסכמתה לכך באופן זמני . השתמש בתכונת המניפסט requestLegacyExternalStorage , השולטת במודל האחסון, כדי לשנות את מצב ברירת המחדל.

מכיוון שגם הרשאות READ_EXTERNAL_STORAGE וגם הרשאות WRITE_EXTERNAL_STORAGE מוגבלות ברכות, אם המתקין לא רשם את האפליקציה ברשימת ההיתרים, ההרשאה שולטת בגישה לאוספים השמיעתיים והחזותיים בלבד, ללא גישה לכרטיס SD. זה חל גם אם האפליקציה מבקשת אחסון מדור קודם. למידע נוסף על הגבלות קשות והן הגבלות רכות, ראה הגבלות קשות ורכות ב-Android 10 .

אם המתקין רשם את ההרשאה ברשימת ההיתרים, אפליקציה הפועלת במצב מדור קודם מקבלת את התנהגות ההרשאה הלא מבודדת. ההרשאה שולטת בגישה לכרטיס SD, ובאוספים השמיעתיים והחזותיים. זה קורה כאשר האפליקציה מכוונת לאנדרואיד 9 ומטה ואינה מצטרפת לאחסון מבודד, או שהיא מכוונת לאנדרואיד 10 ומבטלת הסכמה.

ניתן לציין את מצב רשימת ההיתרים רק בזמן ההתקנה, ולא ניתן לשנות אותו עד שהאפליקציה תותקן.

למידע נוסף על הגדרת הרשאת READ_EXTERNAL_STORAGE , ראה setWhitelistedRestrictedPermissions() במחלקה PackageInstaller.SessionParams .

הרשאות זמן ריצה

אנדרואיד 6.0 מציגה מודל הרשאות זמן ריצה חדש שבו אפליקציות מבקשות יכולות בעת הצורך בזמן ריצה. מכיוון שהדגם החדש כולל את הרשאות READ/WRITE_EXTERNAL_STORAGE , הפלטפורמה צריכה להעניק באופן דינמי גישה לאחסון מבלי להרוג או להפעיל מחדש אפליקציות שכבר פועלות. זה עושה זאת על ידי שמירה על שלוש תצוגות ברורות של כל התקני האחסון המורכבים:

  • /mnt/runtime/default מוצג לאפליקציות ללא הרשאות אחסון מיוחדות, ולמרחב השמות הבסיסי שבו adbd ורכיבי מערכת אחרים.
  • /mnt/runtime/read מוצג לאפליקציות עם READ_EXTERNAL_STORAGE (הגדר LEGACY_STORAGE עבור Android 10)
  • /mnt/runtime/write מוצג לאפליקציות עם WRITE_EXTERNAL_STORAGE

בזמן Zygote fork, אנו יוצרים מרחב שמות של mount עבור כל אפליקציה פועלת ומחברים את התצוגה הראשונית המתאימה למקומה. מאוחר יותר, כאשר ניתנות הרשאות זמן ריצה, vold קופץ למרחב שמות ה-mount של אפליקציות שכבר פועלות ו-Bind מעלה את התצוגה המשודרגת למקומה. שימו לב ששדרוג לאחור של הרשאות תמיד מביא להרג של האפליקציה.

setns() המשמשת ליישום תכונה זו דורשת לפחות לינוקס 3.8, אך תיקונים הועברו בהצלחה ללינוקס 3.4. ניתן להשתמש במבחן PermissionsHostTest CTS כדי לאמת התנהגות הליבה הנכונה.