在Android应用开发过程中,该如何发现性能问题呢?除了用户在使用APP的过程中发现卡顿,有什么方法可以监控卡顿吗?本篇文章主要介绍一些Android为我们已经提供的工具,如何去使用这些工具,通过这些工具帮助我们分析卡顿原因,最终解决卡顿等问题。
Android为我们提供了很多非常优秀的工具来帮我们检查应用性能问题,例如查看layout层次的Hierarchy View、检查过度绘制或渲染的工具 Profile GPU Rendering和静态代码检查工具Lint、Android Studio 自带的 TraceView及Systrace 等。
什么是Profile GPU Rendering?
它是一个图形监测工具,能反应界面是否过度绘制;
打开Profile GPU Rendering,低版本的系统会绘制滚动的柱状图来显示绘制每一帧所消耗的时间,高版本的系统只会显示UI的绘制复杂度。
如何打开Profile GPU Rendering?
手机/模拟器-->开发者选项-->GPU 呈现模式(Profile GPU Rendering),具体如下图:
从上图可以看到一条横着的绿线和很多条形柱,每一条柱状图都由 4 种颜色组成:红、黄、蓝、紫,这些线对应每一帧在不同阶段的实际耗时。
绿色横线
绿线代表16ms,要确保一秒内打到60fps,你需要确保这些帧的每一条线都在绿色的16ms标记线之下.任何时候你看到一个竖线超过了绿色的标记现,你就会看到你的动画有卡顿现象产生。
蓝色
蓝色代表测量绘制的时间,也可以理解为执行每一个 View的 onDraw 方法执行的时间,如果蓝色的线很高时,有可能是因为需要重新绘制,或者自定义视图的onDraw函数处理事情太多。
红色
红色代表执行的时间,这部分是 Android 进行 2D 渲染 Display List 的时间。为了绘制到 屏幕上,Android 需要使用 OpenGl ES 的 API 接口来绘制 Display List,这些 API 有效地将数据 发送到 GPU,最终在屏幕上显示出来。当红色的线非常高时,可能是由重新提交了视图而导致的,例如改变View的大小、位置、颜色等。
橙色
橙色部分表示处理时间,或者是 CPU 告诉 GPU 渲染一帧的地方,这是一个阻塞调用, 因为 CPU 会一直等待 GPU 发出接到命令的回复,如果柱状图很高,就意味着 GPU 太繁忙了。
紫色
紫色段表示将资源转移到渲染线程的时间,只有 Android 4.0 及以上版本才会提供。
任何时候柱状图超过绿线(警戒线,对应时长 16ms),就有可能丢失一帧的内容,虽然对于大 部分应用来说,丢失几帧确实感觉不出卡顿,但保持 UI 流畅的关键就在于让这些垂直的柱 状条尽可能地保持在绿线下面,通常我们只需要关注蓝色、红色和绿线就好。
除了如上方式可以通过柱状图来查看View是否过度绘制,其实Android系统还为我们提供另一种方式来查看View是否过度绘制,具体步骤如下:
手机/模拟器-->开发者选项-->调试GPU过度绘制,
它一共分为四个等级,蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们要尽量减少淡红,深红的模块。
总结
GPU Profile Render 工具能够很好地帮助你找到渲染相关的问题,但是要修复这些问题就不是那 么简单了。需要结合另一个耗时工具和代码来具体分析,找到性能的瓶颈,并进行优化。在 GPU Profile Render 发现有问题的页面后,可以通过另外一个工具 Hierarchy Viewer 来查看页面的布局层次和每个 View 所花的时间。
Hierarchy Viewer 是 Android SDK 自带的一款可视化调试工具,用来检查 Layout 嵌套及绘制时间,以可视化的布局角度直观获取 Layout 布局设计和各种属性信息,开发者在调试和布局 UI 界面时可以很方便地使用,提高用户的开发效率。
比较遗憾的是,在高版本的Android studio,已经去掉了Hierarchy Viewer ,取而代之的是Layout Inspector,Layout Inspector只能查看到布局层次,没法看到View的绘制时间(meausre、layout、draw的时间)。
打开Hierarchy Viewer步骤:
选择Tools->Android->Android Device Monitor 菜单,直接打开 Hierarchy View(Android studio 2.0左右才有)
打开Layout Inspector步骤:
选择Tools->Layout Inspector (Android studio3.0)
Systrace 是 Android 4.1 及以上版本提供的性能数据采样和分析工具。它可以帮助开发者收集 Android 关键子系统(如 surfaceflinger、WindowManagerService 等 Framework 部分关键模块、服务,View 系统等)的运行信息,从而帮助开发者更直观地分析系统瓶颈,改进性能。
由于 Systrace 是以系统的角度返回一些信息,并不能定位到具体耗时的方法,要进一步获取 CPU 满负荷运行的原因,就需要使用前面介绍过的工具 Traceview。具体详情可以参考 性能优化工具(二)-Systrace
TraceView 是 Android SDK 自带的工具,用来分析函数调用过程,可以对 Android 的应用程序以及 Framework 层的代码进行性能分析。它是一个图形化的工具,最终会产生一个图表,用于对性能分析进行说明,可以分析到应用具体每一个方法的执行时间,使用可以非常直观简单,分析性能问题很方便。
在Android studio 3.0之后,Google将Android Monitor 工具废弃了,取而代之的是Android Profiler。Android Profiler 工具可提供实时数据,帮助您了解应用的 CPU、内存、网络和电池资源使用情况。
具体详情可以查看 利用 Android Profiler 测量应用性能
《Android应用性能优化最佳实践》
性能优化工具(二)-Systrace
Android性能优化—TraceView的使用
UI优化之-GPU Rendering Profile