Android 性能优化-UI 性能优化

一.应用为什么会卡顿

为了解决Android中UI不流畅问题,Google在Android4.1版本中引入了一个重大改进-黄油计划。黄油计划中引入了三个核心元素,其中一个就是VSYNC(Vertical Synchronization 垂直同步)。VSYNC会每隔16ms发出一个VSYNC信号,触发CPU跟GPU进行界面渲染,计算跟绘制,让界面的帧率在1秒内达到60fps,使视觉效果达到自然流畅。如果一个在16ms内不能完成界面的渲染,计算跟绘制,就会产生丢帧的现象,丢帧就会造成应用卡顿现象。

二.引起应用卡顿的原因

1.过度绘制。过度绘制就是在同一帧情况下对同一块像素区域进行重复绘制。这样会加重GPU跟CPU的渲染压力,导致渲染时间过长。

2.布局嵌套过多。布局嵌套过多过于复杂也会导致CPU跟GPU的渲染,计算,绘制压力。

3.动画执行次数过多。

4.频繁GC。执行GC的时候,所有操作都需要暂停,等到GC结束后,才能继续执行操作。这样就可能会阻塞CPU跟GPU的渲染,计算跟绘制。

5.执行耗时操作。文件读写,数据操作,较大数据初始化等较为耗时的操作阻塞线程。

三.检测UI卡顿工具

1.开启手机的“调试GPU过度绘制”功能分析UI的绘制情况

在手机的设置->开发选项->调试GPU过度绘制打开调试功能。打开后就可以看到UI的绘制情况了。

15405328-a7f8cf9aab9dab02

)

蓝色,淡绿,淡红,深红代表了4种不同程度的绘制情况,其中蓝色表示只绘制一次,最为理想,深红表示绘制4次以上,性能最差,最为忌讳。对红色以上部分进行重点优化:

减少背景重叠,尽量在子View设置背景,不要在根View设置背景,防止子View有了背景,根View也有了背景,造成重叠。

减少布局的嵌套,减少布局层级。

去除Activity的默认背景色。

在自定义View的onDraw或者自定义ViewGroup的drawChild方法中使用Canvas的clipRect()方法绘制指定区域。

2.使用HierarchyViewer分析UI性能

HierarchyViewer是SDK里面工具,主要功能是检测布局的measure,layout,draw的性能指标,从而帮助开发检测布局的复杂程度跟冗余程度。

在Android studio的导航栏的Tools->Android->Android Devices Monitor选择Hierarchy Viewe, 你会看到这个界面

15405328-2a5eb2bed77b3930

在这里你可能会遇到两个问题:

1.打开之后什么都看不到,错误信息显示Unable to get view server version from device xxxx

解决方法:

使用开发版手机或者模拟器

使用Github的一个开源工具解决这个问题。github.com/romainguy/V…

2.无法显示三个指示灯。

点击视图右上角的

15405328-c61279b40dd17791

图标即可。

三个指示灯从左到右分别代表measure,layout,draw,颜色分别代表渲染性能

绿色:表示该View的此项性能比该View Tree中超过50%的View都要快

黄色: 表示该View的此项性能比该View Tree中超过50%的View都要慢

红色: 表示该View的此项性能是View Tree中最慢的;

使用HierarchyViewer就很容易看出UI的性能问题,就能对症下药,优化渲染性能不好的布局了。

3.Traceview分析函数执行时间

我们分析耗时一个函数是否耗时,如果只是通过程序endTime-startTime来获取某个函数执行的时间,这将是一个非常低效且痛苦的事情。Android SDK里面就提供一个可以分析函数执行效率的工具-Traceview。

在Android studio的导航栏的Tools->Android->Android Devices Monitor选择DDMS,然后选中

15405328-19e1b08cffc318bb

即可开始,然后操作我们需要检测的界面,过一会之后,再点击这个按钮,即可停止。你会看到这样的一张图

15405328-8117ce9b6fdc7c92

这样主要分三个区域,左上部分是记录线程信息,右上部分是记录线程的时间线,下面部分是记录时间线里面函数的调用信息。核心部分是下面部分的区域,它展示该函数占用CPU的时间,函数的运行的真实时间,函数被调用的次数等重要信息,这些信息也是我们分析UI卡顿的重要参考依据。

关于表格里面的属性分别代表的是:

Name:名称

Incl Cpu Time% :函数占用CPU的时间的百分比,包含内部调用其他函数的时间。

Incl Cpu Time :函数占用CPU的时间,包含内部调用其他函数的时间。

Excl Cpu Time :函数占用CPU的时间的百分比,不包含内部调用其他函数的时间。

Incl Real Time %:函数真实执行时间占用百分比,包含内部调用其他函数的时间。

Incl Real Time :函数真实执行时间,包含内部调用其他函数的时间。

Excl Real Time% :函数真实执行时间占用百分比,不包含内部调用其他函数的时间。

Excl Real Time :函数真实执行时间,不包含内部调用其他函数的时间。

Calls+Recur Calls/Total:函数被调用次数以及递归调用占总调用次数的百分比

Cpu Time/Calls:函数占用CPU时间与调用次数的比,相当于函数执行的平均占用CPU时间。

Real Time/Calls:函数真实执行时间与调用次数的比,相当于函数执行的平均真实执行时间。

从这些参数中,我们一般可以定位两类需要优化的函数:

1.执行时间比较长。

2.执行时间断,但是调用次数过于频繁的。

我们还可以对相关属性进行排序跟降序排列,从而定位执行时间较长的或者调用过于频繁的函数并进行优化。

如果你觉得这样做太麻烦,或者你想要更精准检测指定函数的执行时间,那么你可以使用Jake Wharton大神开源的打印函数信息及执行时间的工具:

github.com/JakeWharton…

4.性能监控组件Blockcanary-检测UI卡顿利器

Blockcanary是魔都三帅的大帅开源一个非侵入式的性能监控组件,检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复,是解决UI卡顿的必备神器。

我这里有一些关于免费高阶安卓学习资料和视频以及面试资料,需要的可以关注我的主页!!!

猜你喜欢

转载自blog.csdn.net/weixin_34306676/article/details/87441679