Task Snapshots היא תשתית שנוספה ל-Android 8.0 ומשלבת צילומי מסך של תמונות ממוזערות של 'מהזמן האחרון' וגם של ממשקים שמורים ממנהל החלונות. התמונות הממוזערות של המשימות שבקטע 'מהזמן האחרון' מייצגות את הסטטוס האחרון שלהן.
כשפעילות נכנסה למצב מושהה, מנהל החלונות לא הרס את המשטחים של הפעילות כל עוד הפעילות הזו הייתה בראש המשימות. אם היה צריך להציג שוב את הפעילות הזו, מנהל החלונות יכול היה להתחיל את האנימציה בלי להמתין שהפעילות תסיים לצייר את המסגרת הראשונה שלה, כי הוא יכול היה להשתמש ב-Surface השמור.
ארכיטקטורה
שני המושגים של תמונות ממוזערות של 'מהזמן האחרון' ושל משטחים שמורים מאחדים לתוך 'תמונות ממוזערות של משימות'. כשמשימה עוברת לרקע, מנהל החלונות ממיר את התצוגה שלה לצילומי מסך ומעביר אותם ל-GraphicBuffer. כל עוד האפליקציה של הפעילות העליונה של המשימה נשארת בזיכרון, ה-GraphicBuffer הזה יישאר בזיכרון. עכשיו, כשאותה פעילות תוצג שוב בחזית, מנהל החלונות ייצור חלון מוצא (TaskSnapshotSurface) ויחבר את GraphicBuffer בלי להעתיק זיכרון לתור המאגר של החלון המוצא. ברגע שהפעילות תצייר את הפריים הראשון שלה, החלון הפותח של Task Snapshot ייעלם בהדרגה כמו מסכי פתיחה רגילים.
אותו GraphicBuffer נשלח גם דרך Binder ל-SystemUI כדי לשמש לציור המצב של התצוגה המקדימה של המשימה בתצוגת 'מהזמן האחרון'. מכיוון שזו רק הפניה למאגר, השליחה שלו דרך binder צורכת מעט משאבים. כש-GraphicBuffer מגיע ל-SystemUI, הוא עוטף ב-Bitmap של חומרה ולאחר מכן מצויר במסך בלי העלאת זיכרון לזיכרון הגרפיקה.
יתרונות
לארכיטקטורה החדשה הזו יש שלושה יתרונות עיקריים:
- אם משתמשים בתמונת המצב של המשימה כחלון התחלה, מתבצע מעבר חלק בין תמונת המצב לבין התוכן האמיתי.
- כשצילום המסך של המשימה מצויר ב-SystemUI, אפשר לעשות זאת בלי העתקה. בעבר היה צריך להעתיק את קובץ ה-bitmap ל-Ashmem ואז לזיכרון הגרפיקה. מכיוון שהשיטה הזו שומרת את קובץ ה-snapshot ישירות בזיכרון הגרפיקה, אין צורך בהעתקה.
- המצב שמוצג ב'מהזמן האחרון' תמיד תואם למצב שיוצג בפעם הראשונה כשפותחים מחדש את האפליקציה. בנוסף, שימוש באותו מאגר כאן חוסך הרבה זיכרון. לכן, התמונות האלה מוצגות עכשיו ברזולוציה מלאה ב'מה חדש'. בעבר, הדגימה הוקטנה ב-64% כדי לחסוך בזיכרון.
הטמעה
התכונה הזו קיימת רק בפלטפורמת Android. לא נדרשת שילוב ואין תמיכה בהתאמה אישית. עם זאת, יצרני המכשירים יכולים להשבית את התכונה 'תמונות מצב של משימות' לחלוטין.
כדי להשבית את התכונה הזו, משנים את הפונקציה הזו:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
הערה: אם התכונה מושבתת, לא יוצגו תמונות ממוזערות בתצוגת 'מהזמן האחרון'.
קובצי snapshot ברזולוציה גבוהה וברזולוציה נמוכה
קובצי snapshot של משימות נכתבים בדיסק בשני סקלים. כשמשחזרים קובץ snapshot של משימה מהדיסק, קובצי ה-snapshot ברזולוציה נמוכה נקראים קודם ואז מוחלפים בקובצי ה-snapshot ברזולוציה גבוהה. האופטימיזציה הזו משפרת את זמני הטעינה של התמונות. אחרת, יכול להיות עיכוב קל בקריאת קובץ snapshot מהדיסק, והמשתמש יראה כרטיס משימה ריק עד שהתמונה תהיה זמינה. אפשר להגדיר את הסולמות בקובץ התצורה של שכבת-העל של המכשירoverlay/frameworks/base/core/res/res/values/config.xml
על ידי הגדרת config_highResTaskSnapshotScale
ו-config_lowResTaskSnapshotScale
. כברירת מחדל, הערכים האלה מוגדרים ל-1.0 ול-0.5, בהתאמה. כדי להשבית את התכונה של יצירת קובצי snapshot ברזולוציה נמוכה, מגדירים את הערך של config_lowResTaskSnapshotScale
ל-0.0.
דוגמאות ומקור
שאר הקוד של התכונה הזו נמצא בקובצי TaskSnapshot* במיקומים הבאים:
frameworks/base/+/main/services/core/java/com/android/server/wm/