Home > IT > Article

Android Perfetto 系列 15:Boot Trace、长Time现场 Trace 与偶发问题抓取

2026-10-30  ·  Views: 254
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
unique_session_name: "ui_jank_flight_recorder"

buffers {
size_kb: 65536
fill_policy: RING_BUFFER
}

buffers {
size_kb: 8192
fill_policy: RING_BUFFER
}

trigger_config {
trigger_mode: STOP_TRACING
trigger_timeout_ms: 3600000
triggers {
name: "app_ui_jank"
producer_name_regex: "com\\.example\\.app"
stop_delay_ms: 1000
max_per_24_h: 10
skip_probability: 0.0
}
}

incremental_state_config {
clear_period_ms: 10000
}

data_sources {
config {
name: "linux.ftrace"
target_buffer: 0
ftrace_config {
buffer_size_kb: 4096
buffer_size_lower_bound: true
drain_period_ms: 250
compact_sched {
enabled: true
}
ftrace_events: "sched/sched_switch"
ftrace_events: "sched/sched_waking"
ftrace_events: "power/cpu_frequency"
ftrace_events: "power/cpu_idle"
atrace_categories: "gfx"
atrace_categories: "view"
atrace_categories: "wm"
atrace_categories: "input"
atrace_categories: "binder_driver"
atrace_apps: "com.example.app"
}
}
}

data_sources {
config {
name: "android.surfaceflinger.frametimeline"
target_buffer: 1
}
}

data_sources {
config {
name: "track_event"
target_buffer: 1
track_event_config {
disabled_categories: "*"
enabled_categories: "ui"
enabled_categories: "memory"
enabled_categories: "app"
}
}
producer_name_filter: "com.example.app"
}

data_sources {
config {
name: "linux.process_stats"
target_buffer: 1
process_stats_config {
scan_all_processes_on_start: true
proc_stats_poll_ms: 5000
}
}
}

这里放了两个 Buffer:高频 ftrace/atrace GF入大 Buffer,FrameTimeline、process stats、App Track Event GF入小的语义 Buffer。成因在于:图形难题里,如果 sched 事件保住了、FrameTimeline、App marker 或GF程描述却被覆盖,仍然无法判断是 App、SurfaceFlinger、BufferQueue 还是系统调度导致卡顿。

producer_name_regex 用来限定能激活 trigger 的 producer。正则要和实际 emitter producer Name一致; 如果由测试 harness 代理触发,就把 harness producer 加GF白名单,或者为 harness 单独开 trigger Name。

ftrace_config.buffer_size_kb、buffer_size_lower_bound、drain_period_ms 会增加 kernel per-CPU ftrace buffer 占用和 traced_probes drain 唤醒频率,不能当成所有现场 preset 的默认值。这里把它们留在 UI jank preset,是为了降低高频调度事件在短窗口里被 kernel ftrace 覆盖的概率; 上线前要用短 Trace 验证 ftrace_setup_errors、CPU 开销和写入速率。

FrameTimeline 需要 Android 12 或更高版本。它不是 trigger emitter,只Loss责在 trace 里提供 app frame、SurfaceFlinger frame、jank_type、present_type、on_time_finish 和 app-SF flow 等事实。atrace_apps 必须限定目标包名,不要把 atrace_apps: "*" 当成现场默认方案。

Ring Buffer 能保留多久,不由 trigger_timeout_ms 决定,而由数字写入速率和 Buffer 大小决定。估算方式仍然是第 12 篇那topics:保留窗口秒数 = buffer MB / 写入速率 MB/s。

对 ftrace 还要再看三层 buffer:kernel per-CPU ftrace buffer、producer shared memory、Perfetto central buffer。central buffer 变大只能延长最终保留窗口,救不了 kernel buffer 被 traced_probes 来不及 drain 时的早期丢事件。

This article is published by News for reference only.
123456789
Loading comments…

LinksApply

Alliance Network53