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 还是Draw台调度导致卡顿。
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 时的早期丢事件。
Generate poster / share QR code