קובצי snapshot של משימות

Task Snapshots (תמונות מצב של משימות) היא תשתית שהוצגה ב-Android 8.0, שמשלבת צילומי מסך של תמונות ממוזערות של אפליקציות שהיו בשימוש לאחרונה וגם משטחים שמורים מ-Window Manager. התמונות הממוזערות של הפריטים האחרונים מייצגות את המצב האחרון של משימה בתצוגה 'פריטים אחרונים'.

כשפעילות עוברת למצב עצירה, מנהל החלונות לא משמיד את השטחים של הפעילות כל עוד הפעילות נמצאת בראש המשימה. אם היה צורך להציג את הפעילות הזו שוב, מנהל החלונות הצליח להתחיל את האנימציה בלי לחכות לסיום הציור של הפריים הראשון של הפעילות, כי הוא הצליח להשתמש ב-Saved Surface הזה.

ארכיטקטורה

שני המושגים של תמונות ממוזערות של פריטים אחרונים ומשטחים שמורים מאוחדים עם תמונות מצב של משימות. כשמשימה עוברת לרקע, Window Manager מציב צילום מסך של המשימה הזו ב-GraphicBuffer. כל עוד האפליקציה של הפעילות העליונה של המשימה נשארת בזיכרון, ה-GraphicBuffer הזה יישמר בזיכרון. עכשיו, כשאותה פעילות מועברת שוב לחזית, Window Manager יוצר חלון התחלה (TaskSnapshotSurface) ומצרף את ה-GraphicBuffer בלי להעתיק זיכרון כלשהו לתור במאגר נתונים זמני (buffer queue) של חלון ההתחלה. ברגע שהפעילות תסיים לצייר את הפריימים הראשונים שלה, חלון ההתחלה של תמונת המצב של המשימה ייעלם בהדרגה כמו מסכי פתיחה רגילים.

אותו GraphicBuffer נשלח גם דרך Binder אל SystemUI כדי שישמש לציור מצב התצוגה המקדימה של משימה בתצוגת האפליקציות האחרונות. מכיוון שמדובר רק בהפניה למאגר זמני, שליחתה באמצעות Binder דורשת מעט משאבים. כש-GraphicBuffer מגיע ל-SystemUI, הוא נארז ב-Bitmap של החומרה ואז מצויר על המסך בלי להעלות זיכרון לזיכרון ה-GPU.

יתרונות

לארכיטקטורה החדשה יש שלושה יתרונות עיקריים:

  • אם משתמשים בתמונת המצב של המשימה כחלון התחלתי, יש מעבר הדרגתי יפה בין תמונת המצב לבין התוכן האמיתי.
  • כשמציירים את תמונת המשימה ב-SystemUI, אפשר לעשות זאת בלי להעתיק. בעבר היה צריך להעתיק את מפת הסיביות ל-Ashmem, ואז לזיכרון הגרפיקה. בשיטה הזו התמונה נשמרת ישירות בזיכרון ה-GPU, כך שלא צריך להעתיק אותה.
  • המצב שמוצג בכרטיסייה 'אחרונים' תמיד זהה למצב שיוצג בפעם הראשונה שתפתחו מחדש את האפליקציה. שימוש באותו מאגר כאן גם חוסך הרבה זיכרון. לכן, עכשיו אפשר לראות את התמונות האלה ברזולוציה מלאה בתיקייה 'פריטים אחרונים'. בעבר, המערכת ביצעה דגימת חסר של 64% כדי לחסוך בזיכרון.

הטמעה

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

כדי להשבית את התכונה הזו, צריך לשנות את הפונקציה הזו:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

הערה: אם התכונה מושבתת, בתצוגה 'פריטים אחרונים' לא יוצגו תמונות ממוזערות.

תמונות מצב ברזולוציה גבוהה וברזולוציה נמוכה

תמונות המצב של המשימות נכתבות בדיסק בשני קנה מידה. כשמשחזרים תמונת מצב של משימה מהדיסק, קודם קוראים את תמונות המצב ברזולוציה נמוכה, ואז מחליפים אותן בתמונות המצב המקבילות ברזולוציה גבוהה. האופטימיזציה הזו משפרת את זמני הטעינה של התמונות. אחרת, יכול להיות שיהיה עיכוב קל בקריאת קובץ תמונת המצב מהדיסק, והמשתמש יראה כרטיס משימה ריק עד שהתמונה תהיה זמינה. כדי להגדיר את הסולמות, צריך להגדיר את הערכים config_highResTaskSnapshotScale ו-config_lowResTaskSnapshotScale בקובץ התצורה של שכבת העל במכשיר overlay/frameworks/base/core/res/res/values/config.xml. כברירת מחדל, הערכים האלה מוגדרים ל-1.0 ול-0.5 בהתאמה. כדי להשבית את תמונות המצב ברזולוציה נמוכה, צריך להגדיר את config_lowResTaskSnapshotScale ל-0.0.

דוגמאות ומקור

אפשר למצוא את שאר הקוד של התכונה הזו בקבצים TaskSnapshot* במיקום:

frameworks/base/+/android17-release/services/core/java/com/android/server/wm/