yogaJ好文:
Android运行app的过程中,对于手机具体的运行各方法的耗时和手机硬件的状态,google给我们提供了一个轻量级的工具:Systrace。
说它轻量级,是因为Android底层本身对systrace提供了数据收集,而且systrace本身的性能消耗几乎可以忽略不计。
前期准备:1. java环境 这个不多解释。
2. python 2.7
这里有一个小坑,刚开始我下了个python3.6,然后执行脚本的时候 :
Systrace does not support Python 3.6,Please use Python 2.7
然后就去androidsdk目录下platform-tools/systrace/systrace.py看了一眼脚本,第三行就是:
version = sys.version_info[:2]if version != (2, 7):sys.stderr.write('Systrace does not support Python %d.%d. ''Please use Python 2.7.\n' % version)sys.exit(1)
使用:
首先在自己的代码里找到想要查看的代码块,在之前加入:Trace.beginSection("begin"); 在之后加入 Trace.endSection();


之后 在androidStudio中的terminal里,cd 到 systrace 文件夹内 执行脚本:
./systrace.py -t 10 sched gfx view wm am app -a <package-name>
该脚本命令一般用法:systrace.py[options][category1[category2]]...
google官网上对命令的相关说明:`[options]` 是一些命令参数,`[category]` 等是你感兴趣的系统模块,比如view代表view系统(包含绘制流程),am代表ActivityManager(包含Activity创建过程等)。
分析不同问题的时候,可以选择不同你感兴趣的模块。需要重复的是,尽可能缩小需要Trace的模块,其一是数据量小易于分析;其二,虽然systrace本身开销很小,但是缩小需要Trace的模块也能减少运行时开销。比如你分析卡顿的时候,`power`, `webview` 就几乎是无用的。
自建一个项目,使用systrace获取应用启动信息:

生成了一个trace.html文件,用chrome打开

第一行是cpu使用情况,还有我手机里的各种进程,这里看一下我们的com.example.sunny.myapplication frames 的 UI thread 里,选中要查看的部分:

有measure,layout各方法执行的统计,startActivity,bindApplication相关统计。点击每个item可具体查询那里耗时严重。
在实际的使用中,可以通过多次trace不断缩小目标范围。卡顿如果定位到问题,修改就会好很多。
拖地先生,从事互联网技术工作,在这里每周两篇文章,聊聊日常的实践和心得。往期推荐:

如果对你有帮助,让大家也看看呗~




