android基础知识Android开发经验谈Android开发

Android Studio中使用CPU分析器检查CPU活动和方

2017-11-28  本文已影响87人  lbtrace

本文翻译自Google官方文档https://developer.android.com/studio/profile/cpu-profiler.html

CPU分析器能够帮助你实时的检查app的CPU使用以及线程活动,记录方法调用,从而调试优化App代码。

0x00 为什么要分析CPU的使用

最小化app的CPU使用率有很多优点,例如提供更流程的用户体验,省电。从而app可以运行在各种新旧设备上,也可以使用CPU分析器监视使用中app的CPU使用以及线程活动,如果想要进一步了解app执行的代码流程,应该记录和检查方法调用。

对于app中的每一个线程,你能找到一段时间内执行的方法以及每个方法消耗的CPU资源,从method traces中也能辨识调用者和被调用者,调用者就是调用另一个方法的方法,被调用者就是被其他方法调用的方法,利用这些信息,我们能够找到那些经常消耗很多资源的方法从而优化app避免不必要的工作。

如果想要收集系统信息检查系统进程或者定位UI卡顿问题,应该使用systrace。

另外,如果想要导出使用Debug类捕获的.trace文件,应该使用traceview

0x01 CPU分析器

CPU分析器如上图所示主要包括:

  1. 事件时间轴:显示应用中Activites的状态转换,以及用户与设备的交互,包括屏幕旋转等,想要了解更多的事件以及如何使能它请参考Enable advanced profiling
  2. CPU时间轴:实时的显示app的CPU使用率以及app中的线程数量,也显示其他进程的CPU使用(包括系统进程和其他应用),沿时间轴水平方向移动可以查看CPU使用历史数据。
  3. 线程活动时间轴:列出app中的所有线程,用下面的颜色标识线程的活动状态
    • Green: 线程处于running或者runnable状态
    • Yellow: 线程处于活动状态,但是在等待I/O操作,例如磁盘或者网络I/O
    • Gray: 线程处于睡眠状态,不消耗CPU资源
  4. 记录配置
    • 采样
    • 全部
    • 自定义
  5. 记录按钮:开始/停止记录method trace

分析器也记录Android Studio以及Android platform添加到你的应用的线程的CPU使用,例如:JDWP/Profile Saver/Studio:VMStats/...等。

0x02 记录和检查method traces

选择Sampled或者Instrumented或者自定义配置,点击Record按钮开始method trace,操作你的应用,结束后点击Stop。分析器自动的选中记录的时间范围以及该时间内的tracing信息。如下图所示。可以通过选择线程时间轴来查看不同线程的method trace

  1. 选中的时间范围:想要分析的trace时间段,可以通过拖拽时间段两侧的高亮区域改变范围
  2. 时间戳:显示记录method trace的开始时间和结束时间,如果想在多个trace之间切换,这个比较有用。
  3. Trace板:显示选中线程的方法调用信息,包括方法调用栈以及方法执行时间
  4. 选择以Top Down或者Bottom Up或者Call Chart或者Flame Chart的方式显示method trace
  5. 选择衡量方法执行的不同时间标准
    • 墙上时间:时钟走过的时间
    • 线程时间:时钟走过的时间减去线程不消耗CPU资源的时间,也就是执行该方法线程的实际CPU消耗

0x03 使用Call Chart分析traces

Call Chart是方法调用的图形化表示,水平方向代表方法调用,垂直方向是它的子函数。黄色代表系统APIs函数,绿色代表app自己的函数,蓝色表示3rd APIs(包括Java APIs)如下图所示。

在方法上单击右键可以跳转到源码

0x04 使用Flame Chart分析traces

Flame Chart提供了调用栈的反向调用图,Flame Chart中的水平条表示出现在相同的调用序列中同一方法的执行时间,从图中我们很容易发现哪个方法消耗的时间最多。
为了理解Flame Chart,考虑下面的Call Chart,在方法D中多次调用方法B(B1,B2,B3), 方法B又多次调用方法C(C1,C2)。

因为方法B1,B2,B3出现在相同的调用序列(A->D->B),它们被聚合起来。同样的,C1,C3也被聚合起来,但不包含C2,因为它与C1,C3的调用序列不同。


使用聚合后的方法创建Flame Chart,在Flame Chart中,消耗CPU时间最多的被调用函数首先出现,如下图所示。

0x05 使用Top Down和Bottom Up分析Trace

Top Down表显示一系列可以查看子函数的方法列表,如下图所示,箭头从调用者指向被调用者。

在上面的图中,展开方法A可以看到它的子函数方法B和D,然后,展开方法D可以看到子函数C和B。与Flame Chart相似,Top Down树也聚合相同调用路径下同一方法多次调用,Flame Chart可以理解为Top Down的图形化表示。
Top Down提供以下方法调用消耗的CPU时间信息。

Bottom Up树显示一系列可以查看父函数的方法列表,如下图所示,展开方法C能看到它的父函数B和D

Bottom Up树对于从大到小排序方法时间非常有用。

Self Children Total
Bottom Up树的根方法(根节点) 表示执行自身代码所消耗的时间,不包括子函数。与Top Down树相比,它代表了整个记录期间所有该方法执行的总时间 代表所有子函数的执行时间,与Top Down树相比,它代表了整个记录期间所有该方法的子方法执行的总时间 Self + Children
父方法(子结点) 所有子函数的Self时间之和 所有子函数的Children时间之和 Self + Children

0x06 自定义记录配置

我们可以选择Android Studio提供的记录配置Sampled或者Instrumented,或者自定义配置。打开CPU Recording Configurations对话框可以创建配置或者分析默认配置。

通过选择上图左侧列表,可以分析当前的配置,或者按照如下步骤创建新的配置。

  1. 点击对话框左上角的+
  2. 填写配置名
  3. Trace Technology中选择Sampled或者Instrumneted
  4. 如果选择Sampled,在Sampled interval中输入采样值
  5. 填写File size limit,单位是(MB),如果增加文件大小,记录大量数据,Android Studio可能因为解析文件而响应不及时。
  6. 点击Apply或者OK
上一篇 下一篇

猜你喜欢

热点阅读