Android应用UI性能分析

一、UI性能分析概述

目标:在中低端手机上UI帧率平稳连贯。

1.十六毫秒准则

  • 一般Android设备的屏幕刷新率为60帧每秒,那么一帧的时间为1/60fps = 16.6ms。

  • 所谓的掉帧现象指的是,某一帧的等待数据时间加上绘制图像时间超过16.6ms时,这一帧会被放弃掉,不出现在频幕上,取而代之的是下一帧。

2.系统对UI的优化

  • 软解时代:2.3及之前,所有绘图由CPU完成。
  • 硬解时代:2.3之后,系统增加了GPU,很多绘图操作交给GPU进行渲染。
  • 黄油时代:4.1之后,通过VSYNC垂直同步机制和多缓冲机制(three frame buffer)进一步提高绘制效率。
  • 异步绘制时代:5.0之后,系统增加了Render Thread。通过这个线程进行异步绘制,某一帧发生延迟也不会影响下一帧的绘制。

3.编写布局准则

  • 尽量少嵌套布局。
    因为系统绘制一个ViewGroup时,会采用深度优先遍历遍历每一个子View,所以层级越深,耗费时间是指数增长的。

  • 尽量少编写测量复杂的布局。
    测量复杂的布局如RelativeLayout过多子View,会导致系统需要多次测量才能确定这些View的尺寸。所以极致扁平化布局有可能得不偿失。

  • 终极目标:尽量减少View的数量。
    无论对应减少测量时间以及绘制时间还有内存占用都是有帮助的!

4.一些建议

  • LinearLayout和RelativeLayout对比。

    • LinearLayout优点在于测量方式简单,测量耗时较短,但由于功能简单,通常需要嵌套布局才能实现想要的效果。
    • RelativeLayout优点在于能实现扁平化布局,缺点在于布局越复杂,测量的耗时增加不少,并且有可能需要多次测量。
    • 谷歌推荐使用ConstraintLayout,它能有效减少嵌套布局和实现复杂布局。
  • 使用Merge标签去掉多余层级。

  • 使用ViewStub延时渲染。

二、性能检测工具

1.Hierarcy Viewer

作用:

  • 查看当前界面的View树信息,以及测量,布局,绘制时间。

打开方式:

  • 首先打开Android Device Monitor:SDK目录 -> tools -> monitor。
  • 然后观察窗口顶栏有个带加号窗口按钮,点开发现有Hierarcy Viewer选项。
    DDMS_01

2.Trace for OpenGL ES

作用:

  • 查看当前界面绘制步骤和每步的耗时。

打开方式:

  • 打开的地方同上,窗口顶栏有个带加号窗口按钮,点开发现有Trace for OpenGL ES选项。
    DDMS_01

3.Systrace

作用:

  • 追踪系统性能信息。

打开方式:

  • 图形界面:DDMS内左侧有一栏小图标,倒数第二个图标。(将鼠标长时间停留在图标上会显示提示信息)
    DDMS_02
  • 命令行:SDK目录 -> platform-tools -> systrace。在该目录下执行
    python systrace.py --time=10 -o mytrace.html sched gfx view wm
    抓取Graphics、view、window manager数据。

4.TraceView

作用:

  • 获取单次执行最耗时方法。
  • 获取执行次数最多的方法。

打开方式:

  • DDMS
    DDMS_02

三、参考资料

  • 《Android群英传 神兵利器》
  • Android Developer网站