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

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

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

  • 打开CPU分析器的步骤如下:
    1. 点击 View->Tool Windows->Android Profiler(或者直接点击工具栏中Android Profiler按钮)
    2. 选择需要分析的device和app进程,确保已经enabled USB debugging
    3. 打开CPU Profiler,点击CPU时间轴查看

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

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

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

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

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

0x01 CPU分析器

《Android Studio中使用CPU分析器检查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

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

  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)如下图所示。

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

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

0x04 使用Flame Chart分析traces

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

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

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

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

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

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

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

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

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

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

  • Self: 执行方法自身代码消耗的时间,不包括子函数
  • Children: 执行子函数代码消耗的时间,不包括自身代码
  • Total: Self + Children

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

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

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

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

0x06 自定义记录配置

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

《Android Studio中使用CPU分析器检查CPU活动和方法调用》

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

  1. 点击对话框左上角的+
  2. 填写配置名
  3. Trace Technology中选择Sampled或者Instrumneted
  4. 如果选择Sampled,在Sampled interval中输入采样值
  5. 填写File size limit,单位是(MB),如果增加文件大小,记录大量数据,Android Studio可能因为解析文件而响应不及时。
  6. 点击Apply或者OK
    原文作者:lbtrace
    原文地址: https://www.jianshu.com/p/4de1666baa16
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞