צילומי משימה

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

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

ארכיטקטורה

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

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

יתרונות

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

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

יישום

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

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

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/+/main/services/core/java/com/android/server/wm/