引言
什么是APP性能优化?一言以蔽之,就是使APP运行的更高,更快,更强,更稳定。在代码不够壮健的时候,APP里的问题是出于熵增状态,当熵增到达一个临界点时,就会引发OOM、ANR、Crash、卡顿等问题。本文,就来研究研究如何去做到APP性能优化。
什么叫卡顿?
这里所说的卡顿专门是指用户在使用Android设备的时候出现了丢帧的现象。当某些页面UI比较复杂的时候,Android系统可能无法及时的完成页面UI的渲染。Android系统的渲染机制为了让用户感觉不到卡顿,从而将输出的帧数设置为了60fps(Frames per Second)。由于人类眼睛的特殊生理结构,如果所看画面的帧率是高于24的话,则会认为是连贯的,这个现象称之为视觉暂留。一般来说,30fps是可以接受的。但是如果提升到60fps的话,可以明显提升交互感和逼真感,超过75fps则不容易察觉到有明显的流畅度提升了。而且,当帧率越高时,系统在渲染的时候所需要的资源就越高。为了将资源利用达到最大化,Android系统将输出的帧率固定在了60fps.
为了达到60fps,则Android系统需要在1秒渲染60次,每16ms就需要渲染一次,即发出一次垂直同步(VSYNC)信号,来触发对UI的渲染。那么,程序的大部分及时响应的操作就必须要在16ms内完成。
举个例子:当有个操作耗时20ms,系统在接收到VSYNC信号的时候就无法对UI进行渲染,就会发生丢帧现象。
如何解决卡顿?
1. 减少UI层叠数。
2. 减少动画绘制次数。
3. 优化算法。
4. 避开渲染高峰,不要将所有控件同时渲染。
5. 主线程不要做耗时操作,耗时操作统统交给子线程来负责。
6. 避开GC高峰。
检测卡顿工具
TraceView
首先,打开Android开发工具DDMS。(AndroidStudio的是从Tools->Android->Android Device Monitor).进入以下页面:
选中所需要跟踪的APP后,点击倒数第二个按钮。会弹出以下页面
在这个页面可以设置跟踪项目。选完后点击OK即开始跟踪APP了。
Androidsystrace停止后就会根据上图的设置生成trace.xml文件。打开trace.xml后可以观察surfaceflinger存在很多空断,分布不均匀。如果间隔时间大于16ms的话,则表示在这时间点已经发生丢帧现象了。
通过放大则可以找到具体是哪些方法耗时过长,从而定位到某个方法。
MethodProfiling
方法分析工具的使用
首先,还是和上面一样,先打开DDMS.
点击第六个按钮即可开始进行MethodProfiling了。再次点击,则是结束MethodProfiling并生成分析报告。
通过排查,我找到了自己写的代码
发现这个点击事件需要执行41ms,明显大于16ms,则表示在点击事件里发生了丢帧,产生了卡顿。
再贴一下我的点击事件
写了个三重循环,并将循环后的值赋给一个TextView。很明显,这个三重循环是执行在UI线程里的,而且非常耗时。运行时间肯定是大于16ms。如果将循环次数再次调高的话,APP是一定会ANR的,比卡顿更可怕。
所以,通过MethodProfiling我可以清晰的定位到哪个方法执行耗时过长。这样,可以进行优化修改,达到性能优化的目的。
Profile GPURendering(GPU显示配置文件)
这个工具是集成在Android开发者工具中的。选择GPU显示配置文件,如下:
当UI界面进行刷新的时候,图表页面会滚动显示列来表示每帧渲染所需要的时间,越高表示需要时间越长。中间绿色的线表示16ms,只要每一帧都在绿线以下,那么就不会发生丢帧的现象。其中蓝色的表示测量绘制DisplayList的时间,红色表示OpenGL渲染DisplayList 所需的时间,黄色表示等待GPU处理的时间。
通过图表,可以直观的了解到在具体页面的帧绘制情况。再结合上面的两种工具,可以更清晰的定位到丢帧的方法块。