Perfetto 性能分析实战四步定位卡顿与内存问题【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfettoPerfetto 是 Android、Linux 和 Chrome 系统内置的追踪框架一次采集就能把 CPU 调度、内存分配、帧时间线放进同一条时间轴还能用 SQL 直接查。做 Perfetto 性能分析本质是把猜哪里卡变成看证据。线上偶发 ANRlogcat 为什么帮不上忙某 App 被用户反馈下拉刷新偶尔卡死两秒QA 复现率不到 5%logcat 只有零星 GC 日志堆栈毫无线索。这类问题有个共性耗时发生在毫秒级而日志的采样窗口是秒级卡的又不是异常是主线程被调出 CPU。你真正需要的证据在毫秒级时间轴上——主线程那一刻在跑什么、被谁挤了下去。trace 文件相当于设备的黑匣子事后的每一毫秒都有记录。这正是 Perfetto 性能分析要回答的问题采集调度级事件回放时间轴指出阻塞点。先看 Perfetto 能干什么一条命令采集系统级追踪内核 ftrace、应用 atrace 标注、logcat 全部对齐到同一时间轴所有数据落成 SQL 表slice、thread_state、counter 等可离线查询内置 heapprofd 采样式堆 profiler能看 Java 与 native 内存的分配调用栈Android 12 的 FrameTimeline 会直接报告哪一帧掉了、超支在哪一段核心工作流采集、查看、定位、验证完成第一次追踪采集仓库自带record_android_trace脚本设备连上 adb 直接跑python3 tools/record_android_trace -o trace.perfetto-trace \ -t 10s -b 32mb -a * sched freq view input采集的 10 秒内反复执行卡复现的那个操作脚本跑完会自动拉回文件并打开 UI。在时间轴中锁定目标线程先扫顶部 CPU 泳道确认卡顿窗口里哪颗核在忙然后展开目标进程主线程泳道上那段不在任何 slice 里的空白就是它被调出 CPU 的时间。用 SQL 把结论量化时间轴负责看个大概数字要靠查。下载trace_processor后一条命令就能问trace_processor query trace.perfetto-trace \ SELECT dur, blocked_function FROM thread_state ORDER BY dur DESC LIMIT 5完整参数见 trace_processor 命令行参考。改完代码用同一配置验证验证环节最大的坑是两次采集条件不一致。把配置存成 pbtxt 复用修完再采一次对比同一段操作的前后数据buffers { size_kb: 32768 fill_policy: RING_BUFFER } data_sources { config { name: linux.ftrace ftrace_config { ftrace_events: sched_switch } } }三个高频场景的排查路径锁定主线程阻塞的等待原因现象偶发卡顿一两秒复现率低logcat 无异常堆栈。追踪要点至少开启sched_switch调度事件主线程被调出去后的每段状态S 睡眠 / R 就绪 / D 不可中断等待都会落进 thread_state 表。UI 定位切到主线程泳道选中卡顿窗口右侧会列出每段状态的持续时间和对应 slice若状态是 D 且 blocked_function 指向 futex基本可以断定是锁等待。结论写主线程在 21:03:11 被 futex 等待阻塞 840ms持锁方是后台线程池这样的条件化结论而不是笼统的主线程卡了。锁竞争类问题还可以参考调度阻塞案例研究中基于调度事件触发的调用栈采样做法。用分配栈找出内存增长点症状PSS 随使用时间爬升杀掉进程就回落单次 dump 看不出异常。追踪要点对目标进程开 heapprofd 做采样式堆 profiling采集哪条调用栈分配了多少字节且未释放。UI 定位火焰图里占比最大的未释放栈就是头号嫌疑人点进去能看到分配点所在源码行。结论边界采样 profiler 给的是近似值适合定方向要精确到对象级别再配合 ART heap dump 复核。对比 expected 与 actual 双轨找掉帧表现滚动偶发掉帧帧率监控忽高忽低。追踪要点Android 12 开启 FrameTimeline 后系统会为每个应用维护 expected系统给定的渲染窗口与 actual实际完成耗时两条时间轴。UI 定位找 actual 超出 expected 的 slice对齐同一窗口的 CPU 调度泳道判断是应用算慢了还是被系统挤了。结论边界只有当超支段落在 doFrame 内部时才归因为应用侧超支落在合成阶段则要去看 SurfaceFlinger 一侧。进阶把时间轴当数据库查PerfettoSQL 可以直接 JOIN slice、thread、process、counter 这些系统表也支持INCLUDE PERFETTO MODULE加载官方模块主线程延迟分解、jank 汇总都有现成实现不用从零写 SQL。适用边界单文件、离线、只读分析需要跨设备对齐时钟或处理超大 trace 时再上 server 模式和 manifest 合并。自定义追踪配置是反方向的入口TraceConfig 里每个 data_source 都可以单独开关缓冲策略决定缓冲区满时丢弃还是覆盖最旧数据。排查偶发启动问题用 RING_BUFFER 保留尾部长时间稳定性测试用周期写盘的长 trace。顺序上建议先想清楚我要回答的问题再决定开哪些探针——开满的 trace 又大又难读。给团队的三条落地建议建基线同一台设备每周固定采一次 60s 系统追踪按版本归档性能退化时先和基线 diff而不是凭感觉判断。回归卡点CI 里用trace_processor query跑固定的几条 SQL主线程最大阻塞、PSS 增量超阈值直接标红比人工看 UI 稳定得多。归档带上下文trace 文件旁放一份复现步骤、设备型号与系统版本说明三个月后没人记得那次卡顿是怎么触发的。下一步先拿手边一台 Android 设备跑通采集到查询的闭环再挑项目里最烦的那个性能问题做一次完整归因。比通读全部文档更高效的路径是从系统追踪教程走一遍流程然后直接读一篇案例研究边读边在自己的 trace 上验证。【免费下载链接】perfettoProduction-grade client-side tracing, profiling, and analysis for complex software systems.项目地址: https://gitcode.com/GitHub_Trending/pe/perfetto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考