我们知道,当APP进程的UI Thread和Render Thread在接到VSync信号后,绘制一帧所花的时间超过16.6ms,APP就会发生掉帧,实际上,在画面显示时,不仅仅和当前帧的数据有关,还跟相邻帧的步长有关系,如果相邻的步长没有规定到一个固定的范围内,用户也会感觉到明显的卡顿而Systrace看不出来。
工欲善其事必先利其器,我们一般通过以下几种方式分析卡顿。
SysTrace使用
1.首先要装Python 2.x的版本,SysTrace脚本不支持Python 3.x版本
2.cd命令进入到Android SDK下的SysTrace目录下(Users/zzy/Library/Android/sdk/platform-tools/systrace)执行命令:python systrace.py。
3.滑动要测试的场景即开始trace信息收集,命令行里按回车即开始生成trace.html文件。
注:抓取时可以配置一些参数,若不选择则默认全部抓取,
-o: 指定文件输出位置和文件名
-t: 抓取systrace的时间长度
-a: 指定特殊进程包名(自己加Label时必须加上)
trace文件如图:
其中W、S、A、D键分别表示放大、缩小、左移、右移,红色或黄色的F则表示未能在16毫秒完成绘制的帧,我们可以点击并放大相应区域看到一些跟代码相关的信息,如图:
Profiler 的使用
打开Android Studio的Profiler工具,左侧session处选择我们要监控的进程,右侧看板点击CPU,即到如下界面,点击”Record“按钮,即可开始记录绘制:
手动操作要监控的场景,操作完后,点击”stop“按钮,即生成可分析文件:
同样,我们依然可以使用W、S、A、D来查看trace文件,找出其中的长耗时方法,如图:
打开GPU过度绘制
从手机设置里找到 ”开发者选项“ --》”调试GPU过度绘制“,打开即可查看对应页面是否存在过度绘制的情况。
原色:没有OverDraw;蓝色:1次OverDraw;绿色:两次OverDraw;粉色:三次OverDraw;红色:四次及四次以上;
打开GPU呈现模式分析
从手机设置里找到 ”开发者选项“ -->”GPU呈现模式分析“即可。
这个工具主要用来反映界面的绘制情况,查看是否存在耗时操作,柱状图的每一根代表一帧,随着界面的滚动,柱状图代表每帧画面所需要的渲染时间,柱子越高表示需要花费时间越长。中间的一根横向绿线是标准线,我们要尽量确保绘制时间在标准线以内。
贴一下我们优化前和优化后的效果对比:
总结卡顿优化点:
- 主线程里频繁的网络请求;
- 主线程执行的耗时方法;
- UI布局层级太深,或者自定义View的onDraw()中有复杂计算;
- 频繁GC,内存抖动,消耗在GC上的时间越长,CPU花在界面绘制的时间就缩短;
- JSON转换;
- 减少非必须的UI绘制,比如ViewPager的设置预加载Page等;
- 频繁使用反射调用