בגרסאות קודמות של Android, המערכת סרקה את כל הקבצים שבבעלות אפליקציה מסוימת כדי למדוד את השימוש בדיסק. חישוב המדידה הידנית עשוי להימשך כמה דקות, לפני שהתוצאות יוצגו למשתמשים בהגדרות.
בנוסף, האלגוריתם הפנימי לניקוי קבצים של נתונים שנשמרו במטמון בדק רק את זמן השינוי בכל האפליקציות. כך אפליקציות זדוניות יכלו לפגוע בחוויית המשתמש הכוללת על ידי הגדרת זמנים משתנים לטווח ארוך, כדי להעדיף את עצמן על פני אפליקציות אחרות באופן לא הוגן.
כדי לשפר את החוויה הזו, ב-Android 8.0 אפשר להשתמש בתמיכה של מערכת הקבצים ext4 ב'מכסות' כדי לקבל נתונים סטטיסטיים על שימוש בדיסק כמעט באופן מיידי. התכונה הזו גם משפרת את יציבות המערכת על ידי מניעת שימוש של אפליקציה אחת ביותר מ-90% מנפח הדיסק או ב-50% מה-inodes.
הטמעה
תכונת המכסה היא חלק מההטמעה שמוגדרת כברירת מחדל ב-installd
.
installd
משתמש בתכונה Quota באופן אוטומטי כשהיא מופעלת במערכת קבצים מסוימת. המערכת ממשיכה באופן אוטומטי ובאופן שקוף את החישוב הידני כשתכונה המכסה לא מופעלת או לא נתמכת במכשיר הבלוק שנמדד.
כדי להפעיל תמיכה במכסות במכשיר חסימה מסוים:
- מפעילים את האפשרויות
CONFIG_QUOTA
,CONFIG_QFMT_V2
ו-CONFIG_QUOTACTL
בליבה. - מוסיפים את האפשרות
quota
למחיצה של userdata בקובץ fstab:/dev/block/platform/soc/624000.ufshc/by-name/userdata /data ext4 noatime,nosuid,nodev,barrier=1,noauto_da_alloc latemount,wait,check,formattable,fileencryption=ice,quota
אפשר להפעיל או להשבית את האפשרות fstab
במכשירים קיימים ללא חשש. במהלך האתחול הראשון אחרי שינוי האפשרות fstab
, fsmgr
מאלץ את fsck
לעבור תהליך עדכון של כל המבנים של נתוני המכסות, ולכן האתחול הראשון עשוי להימשך קצת יותר זמן. הפעלות עתידיות לא יושפעו.
תמיכה במכסות נבדקה רק ב-ext4 וב-Linux 3.18 ואילך. אם מפעילים את התכונה במערכת קבצים אחרת או בגרסאות ליבה ישנות יותר, יצרני המכשירים אחראים לבדוק את הנתונים הסטטיסטיים ולבחון את תקינותם.
אין צורך בתמיכה בחומרה מיוחדת.
אימות
יש בדיקות CTS בקטע StorageHostTest
, שמפעילות ממשקי API ציבוריים למדידת השימוש בדיסק. ה-APIs האלה אמורים להחזיר ערכים נכונים, ללא קשר לכך שתמיכת המכסות מופעלת או מושבתת.
ניפוי באגים
באפליקציית הבדיקה מתבצעת הקצאה זהירה של אזורים במרחב הדיסק באמצעות מספרים ראשוניים ייחודיים לגודל. כשמנסים לנפות באגים בבדיקות האלה, אפשר להשתמש בנתונים האלה כדי לקבוע מה גורם לפערים. לדוגמה, אם בדיקה נכשלת עם דלתא של 11MB, צריך לבדוק את השיטה Utils.useSpace()
כדי לראות שה-blob של 11MB נשמר ב-getExternalCacheDir()
.
יש גם כמה בדיקות פנימיות שעשויות להיות שימושיות לניפוי באגים, אבל יכול להיות שיהיה צורך להשבית את בדיקות האבטחה כדי לעבור אותן:
runtest -x frameworks/base/services/tests/servicestests/ \ src/com/android/server/pm/InstallerTest.java
adb shell /data/nativetest64/installd_utils_test/installd_utils_test
adb shell /data/nativetest64/installd_cache_test/installd_cache_test
adb shell /data/nativetest64/installd_service_test/installd_service_test