一、官方工具
一般来说, 学习一门新的技术, 最应该做的就是阅读其官方文档, 那是最权威的。Android本身给我们提供了很多App性能测试和分析工具, 而且大部分都集成到Android Studio或DDMS中,非常方便使用。
1.StrictMode
说明:
顾名思义, “严格模式”,主要用来限制应用做一些不符合性能规范的事情。一般用来检测主线程中的耗 时操作和阻塞。开启StrictMode后, 如果线程中做一些诸如读写文件, 网络访问等操作, 将会在Log console输出一些警告, 警告信息包含Stack Trace来显示哪个地方出了问题。
作用:
主要用来做主线程优化分析
2.Systrace
说明:
Systrace是一个收集和检测时间信息的工具, 它能显示CPU和时间被消耗在哪儿了, 每个进程和线程都在其CPU时间片内做了什么事儿。而且会指示哪个地方出了问题, 以及给出Fix建议.其以trace文件(html)的方式记录。可以直接用Chrome浏览器打开查看。界面如下:
3.Hierarchy Viewer
说明:
Hierarchy Viewer提供了一个可视化的界面来观测布局的层级, 让我们可以优化布局层级, 删除多余的不必要的View层级, 提升布局速度。
作用:
用来做View层级分析, 可以分析出View Tree中的性能阻塞点, 以便对症下药, 提升布局性能.
Hierarchy Viewer需要Root的机器(产品机没有开启ViewServer)才可以执行.可以使用第三方的开源的ViewServer来协助我们在未Root的机器上使用Hierarchy Viewer分析.
示例图:
4.TraceView
说明:
一个图形化的工具, 用来展示和分析方法的执行时间。
作用:
分析方法调用栈以及其执行时间, 优化方法执行。
示例图:
5.Memory Monitor
说明:
内存使用检测器, 可以实时检测当前Application的内存使用和释放等信息, 并以图形化界面展示。
作用:
用来做内存分析, 内存泄露排查的不二之选。可以结合heap viewer, allocation tracker来分析.
可以导出hprof文件结合第三方的MAT工具分析泄露点。因为这个工具在ADT时代比较常用, AS2.0之后, 本身的Memory Monitor越来越强大, 结合日益完善的第三方工具基本上可以完成内存方面的优化了。
示例图:
二、第三方工具
1.Google的Battery Historian
说明 :Google出品, 通过Android系统的bugreport文件来做电量使用分析的工具.
文档 : https://github.com/google/battery-historian
作用 : 用来做电量使用分析.
2.网易的
说明 :针对Android App的CPU, 内存, 网络, 电量等多项综合的测试分析.文档 https://github.com/NetEase/Emmagee
作用 :比官方工具更适合国人使用来做App的整体性能分析.
3.Square
说明 :Square出品, 必属精品 类似与App探针的内存泄露监测工具.
文档 :https://github.com/square/leakcanary
作用 :集成到App中, 用来做内存问题预防最好不过了.
三、Android profile
示例图 :
四、GPU Profile工具
渲染性能问题往往是偷取你宝贵帧数的罪魁祸首,这种问题很容易产生,很容易出现,而且在一个非常方便的工具的帮助下,也非常容易去追踪。使用Peofile GPU Rendering tool,你可以在手机上就可以看到究竟是什么导致你的应用程序出现卡顿,变慢的情况.
绿线
下图中的绿线代表16ms,要确保一秒内打到60fps,你需要确保这些帧的每一条线都在绿色的16ms标记线之下.任何时候你看到一个竖线超过了绿色的标记现,你就会看到你的动画有卡顿现象产生.
柱状图
每一条柱状图都由三种颜色组成: 蓝-红-黄。这些线直接和Android的渲染流水线和他实际运行帧数的时间关联:
蓝色代表测量绘制的时间,或者说它代表需要多长时间去创建和更新你的DisplayList.在Android中,一个视图在可以实际的进行渲染之前,它必须被转换成GPU所熟悉的格式,简单来说就是几条绘图命令,复杂点的可能是你的自定义的View嵌入了自定义的Path。一旦完成,结果会作为一个DisplayList对象被系统送入缓存,蓝色就是记录了需要花费多长时间在屏幕上更新视图(说白了就是执行每一个View的onDraw方法,创建或者更新每一个View的Display List对象).
红色代表执行的时间,这部分是Android进行2D渲染 Display List的时间,为了绘制到屏幕上,Android需要使用OpenGl ES的API接口来绘制Display List.这些API有效地将数据发送到GPU,最总在屏幕上显示出来.
橙色部分表示的是处理时间,或者说是CPU告诉GPU渲染一帧的地方,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复,如果柱状图很高,那就意味着你给GPU太多的工作,太多的负责
视图需要OpenGL命令去绘制和处理.