Perfetto 实操入门以 com.facebook.katana 为例第一步抓取 Trace# 方法 A命令行录制推荐adb shell perfetto\-c---txt\-o/data/misc/perfetto-traces/facebook.perfetto-trace\EOF buffers: { size_kb: 63488 fill_policy: RING_BUFFER } data_sources: { config { name: linux.ftrace ftrace_config { ftrace_events: sched/sched_switch ftrace_events: sched/sched_wakeup ftrace_events: power/cpu_frequency ftrace_events: power/suspend_resume atrace_categories: gfx atrace_categories: view atrace_categories: sched atrace_categories: am atrace_categories: wm atrace_categories: input atrace_categories: binder_driver atrace_apps: com.facebook.katana } } } duration_ms: 10000 EOF# 方法 B用系统自带的 recording config更简单adb shell perfetto\-c/system/etc/perfetto-traces/android.perfetto-trace\-o/data/misc/perfetto-traces/fb.perfetto-trace\--txt\EOF buffers: { size_kb: 63488 } duration_ms: 10000 data_sources: { config { name: linux.ftrace ftrace_config { atrace_apps: com.facebook.katana } } } EOF操作要点录 trace 前先打开 Facebook 并停留在要分析的界面然后启动录制在录制期间复现你要分析的场景滑动 feed、切换 tab 等录制结束后 pull 文件adb pull /data/misc/perfetto-traces/facebook.perfetto-trace.第二步打开 UI 分析浏览器访问https://ui.perfetto.dev点击Open trace file选择刚 pull 下来的.perfetto-trace文件等待加载大文件可能要几秒第三步定位目标进程在左侧面板搜索com.facebook.katana展开后你会看到主线程com.facebook.katana—— UI 渲染在这里RenderThread—— GPU 绘制指令Binder 线程—— 跨进程调用Worker 线程—— 后台任务第四步用 SQL 深入分析Query 面板点击底部Query (SQL)标签页输入 SQL-- 1. 找出所有进程确认包名和 PIDSELECTpid,name,upidFROMprocessWHEREnameLIKE%facebook%;-- 2. 查看该进程所有线程SELECTt.name,t.tid,t.upidFROMthread tJOINprocess pONt.upidp.upidWHEREp.nameLIKE%facebook%katana%;-- 3. 查看主线程耗时最长的 slice函数调用SELECTs.name,s.ts/1e6ASstart_ms,s.dur/1e6ASdur_ms,s.depthFROMslice sJOINthread_track ttONs.track_idtt.idJOINthread tONtt.utidt.utidJOINprocess pONt.upidp.upidWHEREp.nameLIKE%facebook%katana%ANDt.namecom.facebook.katanaANDs.dur0ORDERBYs.durDESCLIMIT20;-- 4. 查看 Binder 跨进程调用排查 IPC 耗时SELECTs.name,s.dur/1e6ASdur_ms,t.nameASthreadFROMslice sJOINthread_track ttONs.track_idtt.idJOINthread tONtt.utidt.utidJOINprocess pONt.upidp.upidWHEREp.nameLIKE%facebook%katana%ANDs.nameLIKEbinder%ORDERBYs.durDESCLIMIT20;第五步常见性能问题快速定位现象看哪里关键 SQL卡顿掉帧主线程长 sliceWHERE dur/1e6 16(超过一帧)启动慢launchingsliceWHERE name LIKE launching%Binder 阻塞binder 线程WHERE name LIKE binder transaction%GC 卡顿主线程WHERE name LIKE %GC%布局慢measure/layout/drawWHERE name LIKE %measure% OR name LIKE %layout%第六步学会看 Timeline 视图缩放Ctrl 滚轮或双指捏合跳转点击 slice 查看详情面板右下角显示 name、dur、args标记区域在 timeline 上拖选一段区域底部会显示该区域的统计对比线程选中主线程和 RenderThread观察它们的交替执行关系第七步导出报告# 用 trace_processor 做批量分析可选gitclone https://github.com/nicovince/perfetto-sql.git# 或直接用 Perfetto 自带的 trace_processor_shelltrace_processor_shell --run-metrics android_startup facebook.perfetto-trace新手常犯的 3 个错误用metadata表查 FPS—— Perfetto 的metadata表没有 FPS 字段正确做法是查actual_frame_timeline_slice或用counter_track里的FrameTimeline相关 track线程名搞混——t.name是线程名p.name是进程名别把com.facebook.katana当线程名查dur的单位—— Perfetto 中dur默认是纳秒显示时记得/1e6转毫秒
阅读完成 · 觉得有帮助?