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分析器

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时间信息。

  • 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对话框可以创建配置或者分析默认配置。

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

  1. 点击对话框左上角的+
  2. 填写配置名
  3. Trace Technology中选择Sampled或者Instrumneted
  4. 如果选择Sampled,在Sampled interval中输入采样值
  5. 填写File size limit,单位是(MB),如果增加文件大小,记录大量数据,Android Studio可能因为解析文件而响应不及时。
  6. 点击Apply或者OK
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271