Android性能优化之路(一)

引言

什么是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高峰。

扫描二维码关注公众号,回复: 2715491 查看本文章

检测卡顿工具

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处理的时间。

通过图表,可以直观的了解到在具体页面的帧绘制情况。再结合上面的两种工具,可以更清晰的定位到丢帧的方法块。




猜你喜欢

转载自blog.csdn.net/shirakawakanaki/article/details/53516325