אפשר לאסוף נתוני מעקב של Winscope באמצעות שורת הפקודה adb
בגרסאות ניפוי באגים (כלומר, גרסאות userdebug
ו-eng
). לפני איסוף עקבות Winscope
עם adb
, מריצים את adb root
.
החל מ-Android 15, קבצים של Winscope משולבים ב-Perfetto ונאספים באמצעות שורת הפקודה של Perfetto. כל מעקב Winscope הוא מקור נתונים של Perfetto עם הגדרה משלו. אפשר להפעיל את ההגדרות בנפרד או בסשן מעקב אחד.
ב-Android מגרסה 14 ומטה, לכל מעקב Winscope יש פקודה שונה ואפשר לאסוף כל אחד מהם בנפרד. מידע נוסף זמין במאמר בנושא לכידת עקבות ב-Android מגרסה 14 ומטה.
WindowManager
משתמשים בשם מקור הנתונים android.windowmanager
לסוג העקבות הזה.
אפשרויות הגדרה
רמת היומן (
log_level
): מציינת את רמת הפירוט של היומן. ערכים נתמכים:-
LOG_LEVEL_VERBOSE
: רישום ביומן של כל הרכיבים עם כמות המידע המקסימלית. -
LOG_LEVEL_DEBUG
: מתעד את כל הרכיבים אבל לא כותב את כל נתוני ההגדרות. -
LOG_LEVEL_CRITICAL
: מתעד רק רכיבים גלויים, עם מינימום תקורה של ביצועים.
-
תדירות הרישום ביומן (
log_frequency
): הגדרה של התדירות שבה הפריטים נרשמים ביומן:-
LOG_FREQUENCY_FRAME
: מעקב אחרי קובצי snapshot של מצב כשמתבצעת הקצאה של פריים. -
LOG_FREQUENCY_TRANSACTION
: עוקב אחרי קובצי snapshot של מצב בכל פעם שמתבצעת פעולת אישור (commit) של טרנזקציה. -
LOG_FREQUENCY_SINGLE_DUMP
: עוקב אחרי תמונות מצב יחידות כ שמקור הנתונים מופעל.
-
פרטים על ערכי ההגדרה מופיעים במאמר בנושא WindowManager.
דוגמה
דוגמה לסוג העקבות WindowManager ב-adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
EOF
ProtoLog
משתמשים בשם מקור הנתונים android.protolog
לסוג העקבות הזה.
אפשרויות הגדרה
מצב מעקב (tracing_mode
): קובע את הגדרת היומן לשימוש:
-
DEFAULT
: Traces מתעד רק קבוצות ורמות של יומנים שצוינו ב-group_overrides
. -
ENABLE_ALL
: עוקב אחרי כל קבוצות היומנים והרמות, אלא אם צוין אחרת ב-group_overrides
.
רמת היומן המינימלית (default_log_from_level
): אם מוגדרת רמה, כל הודעה עם רמת יומן שגבוהה מהרמה הזו או שווה לה נרשמת למעקב, אלא אם צוין שינוי ברירת המחדל של קבוצה. לדוגמה, משתמשים בזה כדי להפעיל רישום של כל האזהרות והשגיאות ביומן, בלי להפעיל את כל היומנים. הערכים הנתמכים הם:
PROTOLOG_LEVEL_DEBUG
PROTOLOG_LEVEL_VERBOSE
PROTOLOG_LEVEL_INFO
PROTOLOG_LEVEL_WARN
PROTOLOG_LEVEL_ERROR
PROTOLOG_LEVEL_WTF
הגדרות שחלות על קבוצות (group_overrides
): מאפשרות הגדרה ידנית של רמת היומן לכל קבוצת ProtoLog. כל קבוצה מכילה:
-
name
: שם קבוצת ProtoLog, שמשמש בקוד המקור של Android. -
log_from
: זהה ל-default_log_from_level
אבל מצוין רק עבור הקבוצה הנוכחית.
collect_stacktrace
: אם הערך הואtrue
, מתבצע איסוף של מעקב אחר מחסנית (stack trace) לכל הודעת ProtoLog בקבוצה שעוקבים אחריה.
דוגמה
דוגמה לסוג העקבות ProtoLog עבור adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: DEFAULT
default_log_from_level: PROTOLOG_LEVEL_WARN
group_overrides: {
group_name: "WM_SHELL_STARTING_WINDOW"
log_from: PROTOLOG_LEVEL_DEBUG
collect_stacktrace: true
}
}
}
}
EOF
קלט
משתמשים בשם מקור הנתונים android.input.inputevent
לסוג העקבות הזה.
אפשרויות הגדרה
מצב מעקב (trace_mode
): קובע אם להתחיל את מעקב הקלט באמצעות כללים לשמירה על הפרטיות או לתעד את כל אירועי הקלט:
-
TRACE_MODE_TRACE_ALL
: מתעד את כל אירועי הקלט שעובדו על ידי המערכת, ללא קשר להקשר שבו הם עובדו. -
TRACE_MODE_USE_RULES
: משתמש בכללי המעקב שמוגדרים בהגדרה הזו כדי לציין אילו אירועים לעקוב. מידע נוסף על הגדרת הכללים למעקב זמין במאמר בנושאandroid_input_event_config.proto
.
דוגמה
הנה דוגמה לסוג של מעקב קלט ב-adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
EOF
SurfaceFlinger (layers)
משתמשים בשם מקור הנתונים android.surfaceflinger.layers
לסוג העקבות הזה.
אפשרויות הגדרה
מצב מעקב (mode
): מגדיר את התדירות שבה הפריטים נרשמים ביומן:
-
MODE_ACTIVE
: תמונות מצב של שכבות של עקבות. תמונת מצב מצולמת בכל פעם שמתרחש שינוי בשכבות. -
MODE_GENERATED
: יוצר תמונות מצב של שכבות מהעסקאות שנשמרו במאגר הזמני הפנימי של SurfaceFlinger. יצירת התמונות של השכבה מתרחשת כשמקור הנתונים הזה מתרוקן. -
MODE_DUMP
: מעקב אחר קובץ snapshot של שכבה אחת. -
MODE_GENERATED_BUGREPORT_ONLY
: כמוMODE_GENERATED
, אבל מפעיל את יצירת התמונות של השכבות רק כשמפיקים דוח באגים, ולא בכל פעם שמתבצעת שטיפה של נתוני מעקב.
דגלים של Trace (trace_flags
):
-
TRACE_FLAG_INPUT
: אם הממשק מכיל נתוני קלט, המאפיין הזה עוקב אחרי הפרטים הספציפיים של חלון הקלט. -
TRACE_FLAG_COMPOSITION
: מעקב אחר סוג הקומפוזיציה והאזור הגלוי.
TRACE_FLAG_EXTRA
: עוקב אחרי מטא-נתונים נוספים של משטחים, כולל שכבות מחוץ למסך.
TRACE_FLAG_HWC
: עקבות של מטא-נתונים נוספים לא מובנים של כלי ההלחנה של החומרה.
TRACE_FLAG_BUFFERS
: הגדרת SurfaceFlinger למעקב אחרי כל השינויים במאגרים בפלטפורמה. כברירת מחדל, SurfaceFlinger עוקב אחרי מצב חדש רק כשמתרחשים שינויים בגיאומטריה.
TRACE_FLAG_VIRTUAL_DISPLAYS
: כולל שכבות של תצוגה וירטואלית בנתוני המעקב.
דוגמה
הדוגמה הבאה מציגה את סוג העקבות SurfaceFlinger עבור adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
EOF
במאמר SurfaceFlinger מוסבר מה המשמעות של ערכי הגדרה שונים.
מעברים בין Shell
צריך להשתמש בשם מקור הנתונים com.android.wm.shell.transition
עבור סוג העקבות הזה.
אפשרויות הגדרה
אין אפשרויות הגדרה לסוג העקבות הזה.
דוגמה
דוגמה לסוג המעקב אחר מעבר בין אפליקציות במעטפת של adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
EOF
SurfaceFlinger (transactions)
משתמשים בשם מקור הנתונים android.surfaceflinger.transactions
לסוג העקבות הזה.
אפשרויות הגדרה
מצב מעקב (mode
): מגדיר את התדירות שבה הפריטים נרשמים ביומן:
MODE_CONTINUOUS
: SurfaceFlinger כותב את מאגר הטבעות הפנימי של טרנזקציות בכל פעם שמקור הנתונים מתרוקן. המאגר המעגלי מכיל את המצב הראשוני של SurfaceFlinger ואת העסקאות האחרונות.
MODE_ACTIVE
: SurfaceFlinger כותב את המצב הראשוני ואז כל טרנזקציה נכנסת עד שמקור הנתונים נעצר.
דוגמה
הדוגמה הבאה ממחישה את סוג העקבות של טרנזקציות SurfaceFlinger עבור adb.
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
EOF
IME
משתמשים בשם מקור הנתונים: android.inputmethod
עבור סוג העקבות הזה.
אפשרויות הגדרה
אין אפשרויות הגדרה לסוג העקבות הזה.
דוגמה
דוגמה לסוג העקבות של IME עבור adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.inputmethod"
}
}
EOF
ViewCapture
משתמשים בשם מקור הנתונים android.viewcapture
עבור סוג העקבות הזה.
אפשרויות הגדרה
אין אפשרויות הגדרה לסוג העקבות הזה.
דוגמה
דוגמה לסוג העקבות ViewCapture ב-adb:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
דוגמה מלאה
בעזרת Perfetto אפשר לאסוף נתונים מכמה מקורות בהגדרה אחת. אפשר לאסוף את כל העקבות של Winscope באמצעות פקודה אחת:
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: ENABLE_ALL
}
}
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
data_sources: {
config {
name: "android.inputmethod"
}
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
איסוף נתוני מעקב ב-Android מגרסה 14 ומטה
מריצים את הפקודה adb root
לפני שמריצים את הפקודות adb shell
לכל אחד מהמעקבים הבאים. בסוף המעקב, קובצי המעקב זמינים ב-/data/misc/wmtrace
. כדי להעתיק קובץ או ספרייה ואת ספריות המשנה שלהם ממכשיר, אפשר לעיין במאמר העתקת קבצים אל מכשיר וממנו.
נתוני מעקב של WindowManager
כדי לתעד עקבות של WindowManager:
הפעלת מעקב:
adb shell wm tracing start
השבתת מעקב:
adb shell wm tracing stop
שמירת נתוני הרישום בקובץ בזמן הפעלת לכידת מעקב:
adb shell wm tracing save-for-bugreport
רישום המעקב ביומן פעם אחת לכל פריים:
adb shell wm tracing frame
רישום כל עסקה ביומן:
adb shell wm tracing transaction
הגדרת הגודל המקסימלי של היומן (ב-KB):
adb shell wm tracing size
הדפסת סטטוס המעקב:
adb shell wm tracing status
מגדירים את רמת היומן ל-
critical
(חלונות גלויים בלבד עם מידע מצומצם), ל-trim
(כל החלונות עם מידע מצומצם) או ל-all
(כל החלונות והמידע):adb shell wm tracing level
WindowManager dumps
כדי לצלם קובצי dump של WindowManager:
adb exec-out dumpsys window --proto > window_dump.winscope
ProtoLog
הפקודות הבאות משמשות למערכת ProtoLog.
במהלך התהליך system_server
:
התחלת ProtoLog:
adb shell cmd window logging start
הפסקת ProtoLog:
adb shell cmd window logging stop
הפעלת ProtoLog עבור קבוצות יומנים נתונות:
adb shell cmd window logging enable [group...]
כדי להשבית את ProtoLog עבור קבוצות יומנים מסוימות:
adb shell cmd window logging disable [group...]
הפעלת רישום ביומן של Logcat עבור קבוצות יומנים נתונות:
adb shell cmd window logging enable-text [group...]
השבתת הרישום ביומן Logcat עבור קבוצות יומנים נתונות:
adb shell cmd window logging disable-text [group...]
ב-WMShell:
התחלת ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
מעקבים של SurfaceFlinger (שכבות)
מעקב אחר שכבות SurfaceFlinger משתמש במעקב Perfetto לצורך לכידה. מידע על ההגדרה זמין במאמר בנושא הגדרת מעקב.
הנה דוגמה להגדרה של מעקב אחר שכבות SurfaceFlinger:
unique_session_name: "surfaceflinger_layers_active"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
הנה פקודה לדוגמה ליצירת מעקב אחר שכבות SurfaceFlinger:
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
SurfaceFlinger dumps (layers)
כדי לצלם קובצי dump של SurfaceFlinger:
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
מעברים בין Shell
הפקודות הבאות משמשות למעקב אחר מעברים.
במהלך התהליך system_server
:
מתחילים מעקב:
adb shell cmd window shell tracing start
הפסקת מעקב:
adb shell cmd window shell tracing stop
כדי להתחיל מעקב ב-WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
כדי להפסיק את המעקב ב-WMShell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
הפקודות הבאות משמשות למעקב אחר עורך שיטות קלט (IME):
מתחילים מעקב אחר IME עבור לקוחות של שיטת קלט (IM), שירות שיטת קלט (IMS) ושירות ניהול שיטת קלט (IMMS):
adb shell ime tracing start
מתחילים לעקוב אחרי לקוחות IME, IMS ו-IMMS:
adb shell ime tracing stop
SurfaceFlinger (transactions)
במעקב אחר עסקאות של SurfaceFlinger נעשה שימוש במעקב Perfetto לצורך לכידה. מידע על ההגדרה זמין במאמר בנושא הגדרת מעקב.
הדוגמה הבאה מציגה הגדרת Perfetto למעקב פעיל של SurfaceFlinger:
unique_session_name: "surfaceflinger_transactions_active"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
write_into_file: true
file_write_period_ms: 100
הנה דוגמה להגדרת Perfetto למעקב רציף של SurfaceFlinger:
unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_CONTINUOUS
}
}
}
הנה פקודה לדוגמה ליצירת מעקב אחר טרנזקציות של SurfaceFlinger:
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \