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

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

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

ארכיטקטורה

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

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

יתרונות

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

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

הטמעה

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

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

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

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

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

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

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

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

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