תמונות מצב של המשימות

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

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

ארכיטקטורה

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

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

יתרונות

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

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

הטמעה

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

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

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

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

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

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

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

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

frameworks/base/+/main/services/core/java/com/android/server/wm/