Fellow Travellers

Android 性能分析工具

肖健
字数统计: 1.5k阅读时长: 5 min
2018/07/01 Share

一、官方工具

一般来说, 学习一门新的技术, 最应该做的就是阅读其官方文档, 那是最权威的。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命令去绘制和处理.

五、结语

1。不要重复造轮子

2.别盲目的选择library

3.阅读更多的代码

4.看在上帝的份上,维护一个恰当的编程规范

5.分析是你最好的朋友

6.测试,测试,再测试!

7.借助工具:充分利用现有工具进行敏捷开发。

CATALOG
  1. 1. 一、官方工具
    1. 1.1. 1.StrictMode
    2. 1.2. 2.Systrace
    3. 1.3. 3.Hierarchy Viewer
    4. 1.4. 4.TraceView
    5. 1.5. 5.Memory Monitor
  2. 2. 二、第三方工具
    1. 2.1. 1.Google的Battery Historian
    2. 2.2. 2.网易的
    3. 2.3. 3.Square
  3. 3. 三、Android profile
  4. 4. 四、GPU Profile工具
    1. 4.0.1. 绿线
    2. 4.0.2. 柱状图
  • 5. 五、结语
    1. 5.0.1. 1。不要重复造轮子
    2. 5.0.2. 2.别盲目的选择library
    3. 5.0.3. 3.阅读更多的代码
    4. 5.0.4. 4.看在上帝的份上,维护一个恰当的编程规范
    5. 5.0.5. 5.分析是你最好的朋友
    6. 5.0.6. 6.测试,测试,再测试!
    7. 5.0.7. 7.借助工具:充分利用现有工具进行敏捷开发。