背景
perfetto可以分析很多性能问题。比如查看方法耗时,janky frames等信息。方法耗时这个数据,可就猛了,从framework层到内核层的函数都可以跟踪。还有丰富的数据库,可供查询。甚至可以在整机代码中,自定义想要追踪的某段代码,让它出现在trace的切片当中。
性能优化之UI相关,可以查看绘制、渲染相关函数时长,trace本身也会总结janky frames等数据
性能优化之内存相关,可以查看内核有关allocwait、allocstall的函数切片看看
性能优化之cpu相关,可以查看cpu调度情况和频率波形图
原理不多说,聚焦于使用。
使用
1.抓取指令
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
2、操作想要抓取的场景
3、导出trace文件
adb pull /data/misc/perfetto-traces/trace_file.perfetto-trace
-
在谷歌perfetto解析网站解析抓到的trace
进入网站,把trace文件拖进去。perfetto官网 -
查看trace
trace可以查看进程信息和cpu调度
- 查看进程
查看进程有2种方式:1、看图形化切片 2、sql语句查询
1、查看图形化切片
加载好trace后,会显示很多进程 随着时间各个函数的起始点和结束点,可以通过鼠标放大,查看函数的详细情况。每个函数对应的起始点和结束点,在perfetto就叫做一个切片(slice),数据库中也有对应的table。
2、sql语句 查看数据
导出来的trace文件xxx.pftrace。包含了很多数据库table。
table有slice、thread_track、thread、process等等,更多table可以去perfetto网站看。
其中slice这个表,有ts(切片开始时的时戳)、dur(切片的持续时间)、name(切片名字)等字段
示例和讲解:
SELECT *//选择表里所有字段
FROM slice //查询第1个表slice
JOIN thread_track ON slice.track_id = thread_track.id //JOIN实现 跨表查询 第2个表thread_track
JOIN thread ON thread_track.utid = thread.utid //JOIN实现 跨表查询 第3个表thread
JOIN process ON thread.upid = process.upid //JOIN实现 跨表查询 第4个表process
WHERE pid=10086 AND slice.name LIKE "%doTraversals%" //WHERE实现 查询结果中限定条件:process表中pid=10086的进程和slice表中切片名包含doTraversals
- 查看cpu调度
trace会显示所有cpu核心的调度情况,以及cpu的频率情况。会按照cpu的编号,比如8核cpu,从cpu0~cpu7显示信息。