本文翻译自Google官方文档https://developer.android.com/studio/profile/cpu-profiler.html
CPU分析器能够帮助你实时的检查app的CPU使用以及线程活动,记录方法调用,从而调试优化App代码。
- 打开CPU分析器的步骤如下:
- 点击 View->Tool Windows->Android Profiler(或者直接点击工具栏中Android Profiler按钮)
- 选择需要分析的device和app进程,确保已经
enabled USB debugging
- 打开CPU Profiler,点击CPU时间轴查看
0x00 为什么要分析CPU的使用
最小化app的CPU使用率有很多优点,例如提供更流程的用户体验,省电。从而app可以运行在各种新旧设备上,也可以使用CPU分析器监视使用中app的CPU使用以及线程活动,如果想要进一步了解app执行的代码流程,应该记录和检查方法调用。
对于app中的每一个线程,你能找到一段时间内执行的方法以及每个方法消耗的CPU资源,从method traces中也能辨识调用者和被调用者,调用者就是调用另一个方法的方法,被调用者就是被其他方法调用的方法,利用这些信息,我们能够找到那些经常消耗很多资源的方法从而优化app避免不必要的工作。
如果想要收集系统信息检查系统进程或者定位UI卡顿问题,应该使用systrace。
另外,如果想要导出使用Debug
类捕获的.trace
文件,应该使用traceview。
0x01 CPU分析器
CPU分析器如上图所示主要包括:
- 事件时间轴:显示应用中Activites的状态转换,以及用户与设备的交互,包括屏幕旋转等,想要了解更多的事件以及如何使能它请参考Enable advanced profiling。
- CPU时间轴:实时的显示app的CPU使用率以及app中的线程数量,也显示其他进程的CPU使用(包括系统进程和其他应用),沿时间轴水平方向移动可以查看CPU使用历史数据。
- 线程活动时间轴:列出app中的所有线程,用下面的颜色标识线程的活动状态
- Green: 线程处于
running
或者runnable
状态 - Yellow: 线程处于活动状态,但是在等待I/O操作,例如磁盘或者网络I/O
- Gray: 线程处于睡眠状态,不消耗CPU资源
- Green: 线程处于
- 记录配置
- 采样
- 全部
- 自定义
- 记录按钮:开始/停止记录method trace
分析器也记录Android Studio以及Android platform添加到你的应用的线程的CPU使用,例如:JDWP/Profile Saver/Studio:VMStats/...等。
0x02 记录和检查method traces
选择Sampled或者Instrumented或者自定义配置,点击Record按钮开始method trace,操作你的应用,结束后点击Stop。分析器自动的选中记录的时间范围以及该时间内的tracing信息。如下图所示。可以通过选择线程时间轴来查看不同线程的method trace。
- 选中的时间范围:想要分析的trace时间段,可以通过拖拽时间段两侧的高亮区域改变范围
- 时间戳:显示记录method trace的开始时间和结束时间,如果想在多个trace之间切换,这个比较有用。
- Trace板:显示选中线程的方法调用信息,包括方法调用栈以及方法执行时间
- 选择以Top Down或者Bottom Up或者Call Chart或者Flame Chart的方式显示method trace。
- 选择衡量方法执行的不同时间标准
- 墙上时间:时钟走过的时间
- 线程时间:时钟走过的时间减去线程不消耗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时间信息。
- Self: 执行方法自身代码消耗的时间,不包括子函数
- Children: 执行子函数代码消耗的时间,不包括自身代码
- Total: Self + Children
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对话框可以创建配置或者分析默认配置。
通过选择上图左侧列表,可以分析当前的配置,或者按照如下步骤创建新的配置。
- 点击对话框左上角的
+
- 填写配置名
- 在Trace Technology中选择Sampled或者Instrumneted
- 如果选择Sampled,在Sampled interval中输入采样值
- 填写File size limit,单位是(MB),如果增加文件大小,记录大量数据,Android Studio可能因为解析文件而响应不及时。
- 点击Apply或者OK