ViewCapture הוא כלי תוכנה שמצלם את המאפיינים של התצוגות (כמו מיקום, גודל, קנה מידה וחשיפה) שמצורפות לחלונות שהוא מחובר אליהם. ViewCapture מתעד מידע על התצוגות השונות בחלון ועל המאפיינים שלהן, וכך מאפשר לכם לדעת מה מצב חוויית המשתמש ברגעים ספציפיים ולעקוב אחרי שינויים לאורך זמן.
הקלטות מסך יכולות להמחיש את המצב של תצוגה בזמן מסוים ולהראות איך היא משתנה, אבל הן דורשות משאבי CPU משמעותיים ויכולות להשפיע על הביצועים. הכלי ViewCapture משפיע פחות על המשאבים, ואפשר להפעיל אותו בתדירות גבוהה יותר. בנוסף, ViewCapture מציג את ההדמיות פריים אחר פריים ברמת התצוגה, כך שקל יותר לבדוק את מצב התצוגה ברגעים ספציפיים בהשוואה להקלטות מסך.
בדף הזה מוסבר איך להטמיע את ViewCapture באפליקציות מערכת.
שימוש
ViewCapture.java מטמיע מופע של onDrawListener ואוסף עקבות של ViewCapture במהלך תהליך הציור. כל ציור מחדש של פריים מפעיל מעבר היררכי בעץ התצוגה, החל מתצוגת הבסיס של החלון.
הפונקציה ViewCapture משתמשת בשיטות getter ציבוריות של View.java כדי לאחזר ולהעתיק ערכים לשרשור ברקע, וכך לשפר את הביצועים. ההטמעה של ViewCapture מבצעת אופטימיזציה של התהליך הזה על ידי בדיקה אם התצוגה מלוכלכת או לא תקפה באמצעות captureViewTree, וכך נמנעת סריקה של כל ההיררכיה של התצוגה. captureViewTree זמין רק לאפליקציות מערכת והוא חלק מ-UnsupportedAppUsage API.
השימוש ב-API הזה מוגבל לאפליקציות על סמך גרסת ה-SDK שהן מיועדות לה.
מגבלות
בקטע הזה מתוארות מגבלות הביצועים והזיכרון של ViewCapture.
ביצועים
התקורה הממוצעת של התהליכון הראשי לביצועים של ViewCapture היא 195 מיקרו-שניות. עם זאת, בתרחישים של המקרה הגרוע ביותר, יכול להיות שייקח בערך 5 אלפיות השנייה. אפשר לעיין בפלח vc#onDraw ב-trace של Perfetto.
הוצאות התקורה נובעות בעיקר מהפעולות הבאות:
- המעבר בהיררכיה עולה 50 מיקרו-שניות, גם כשמבצעים גיזום.
- שליפת אובייקטים ממקצה זיכרון של רשימה חופשית כדי לאחסן עותקים של מאפייני תצוגה עולה 20 מיקרו-שניות.
- אחזור של כל ערך מאפיין באמצעות פונקציית getter מוביל להרבה קריאות נוספות לפונקציה לכל תצוגה, בעלות של 110 מיקרו-שניות.
לכן, הפעלת ViewCapture ב-always on-tracing  (AOT) משפיעה לרעה על ביצועי המערכת וגורמת לבעיות. בגלל מגבלות הביצועים והזיכרון האלה, הגישה הזו לא מוכנה ל-AOT. מומלץ להשתמש ב-ViewCapture רק לניפוי באגים במעבדה ובמחשב המקומי.
זיכרון
השיטה של Perfetto למעקב אחר ViewCapture משתמשת במאגר טבעתי יחיד עם טביעת זיכרון מוגדרת מראש כדי למנוע שימוש מוגזם בזיכרון. הגישה הזו מונעת צריכת זיכרון מוגזמת כי היא לא יוצרת מאגרי נתונים זמניים נפרדים לכל חלון. עם זאת, הפתרון הזה לא פותר את הבעיה של אחסון היררכיית התצוגה המלאה לכל מצב ב-Perfetto לכל פריים. הקלטה של חלון יחיד, כמו NexusLauncher, יכולה ליצור נתונים של ViewCapture באורך של יותר מ-30 שניות במאגר זמני של 10 MB. כדי לצלם יותר מ-30 חלונות מממשק המשתמש של המערכת, צריך להגדיל את המאגר או לקצר משמעותית את זמן ההקלטה.
הוראות
כדי להפעיל את ViewCapture באפליקציות מערכת, פועלים לפי ההוראות הבאות:
- מוסיפים את התלות לקובץ - Android.bp, כמו שמוצג בקוד של מרכז האפליקציות.- android_library { name: "YourLib", static_libs: [ ... "//frameworks/libs/systemui:view_capture", ... ], platform_apis: true, privileged: true, }
- יוצרים מופע ViewCapture כשיוצרים את החלון, לדוגמה: - 
private SafeCloseable mViewCapture; @Override protected void onCreate(Bundle savedInstanceState) { ... mViewCapture = ViewCaptureFactory.getInstance(this).startCapture(getWindow()); }
- 
private SafeCloseable mViewCapture; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (enableViewCaptureTracing()) { mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext()) .startCapture(getRootView(), ".NotificationShadeWindowView"); } ... }
 
- 
- סוגרים את המופע של ViewCapture כשמבטלים את החלון, כמו בדוגמאות הבאות: