(一)Android 性能优化 Cpu Profiler

小酌鸡汤

业精于勤,荒于嬉。

本文来源《Android 性能优化 全家桶》

为什么优化Cpu使用率?

 优化应用的 CPU 使用率能带来诸多好处,如提供更快、更顺畅的用户体验,以及延长设备电池续航时间。

性能低会引起哪些现象?

 常见的表现有启动时间久、界面切换慢、页面刷新掉帧、卡顿、耗电,还会引发应用无响应、程序崩溃的现象。

论工具的重要性

 当我们遇到性能瓶颈时,如何来定位性能问题?如果你还停留在肉眼判断、多次复现总结规律、二分法代码注释删除测试、增加log观察、debug断点…这个时候就需要定性和定量分析了…
 是可忍熟不可忍,大声的喊出:我需要工具、工具、工具…

为什么要用profiler?

 分析cpu性能的工具有很多,有traceview(profiler已经替代它了),profiler, systrace,以及perfetto(用来替代systrace)。不要急,后续都会系列文章中介绍…
 profiler在与应用交互时实时检查应用的cpu使用率和线程活动,也可以检查记录方法跟踪数据、函数跟踪数据和系统跟踪数据的详细信息。举个栗子,profiler可以查看某段时间某个线程执行了哪些方法,以及方法耗时和调用堆栈等信息。

现在,就一起实操体验profiler吧!

(1)profiler实操环境(可选项,用自己的环境和代码也一样)
  • SamplePop代码下载
  • SamplePop环境如下:
     Android Studio 4.0
     Gradle version 6.1.1
     Android API version 30
(2)打开profiler
  • profiler打开位置:View -> Tool Windows -> Profiler
  • 当然也可以直接运行程序并启用profiler监控:Run -> Profiler
(3)来吧,一起预览一下吧:
profiler概览
(4)点击cpu分类栏,就可以进入到cpu profiler详情页:
cpu-profiler录制前概览
  • 窗口1:分别由以下几个功能按钮组成
    性能分类切换按钮,包括:cpu、memeory、network、energy。
    选择记录配置按钮,包括:对java方法采样、跟踪java方法、对c/c++函数采样、跟踪系统调用。如果大家要详细了解记录配置的区别,直接移步到文章结尾的官网链接。
    记录开始和停止按钮,包括:record、stop。
  • 窗口2:页面调整按钮集合,包括:缩小,放大、重置、暂停、开始等。
  • 窗口3:事件时间轴,显示Activity的生命周期不同状态,用户交互事件,如点击,旋转等。
  • 窗口4:cpu时间轴,显示实时cpu使用率以及当前使用线程总数。也会有其他进程的cpu使用率显示,方便进行对比。
  • 窗口5:线程活动时间轴,列出属于应用进程的每个线程,并使用下面列出的颜色在时间轴上指示它们的活动。
    绿色:表示线程处于活动状态或准备使用 CPU。也就是说,线程处于正在运行或可运行状态。
    黄色:表示线程处于活动状态,但它正在等待一项 I/O 操作(如磁盘或网络 I/O)。
    灰色:表示线程处于休眠状态并且没有占用任何 CPU 时间。
(5)录制一段cpu监听记录(在录制过程中,执行一些操作,在观察录制数据时,更好分析寻找切入点):
cpu-profiler录制中概览
(6)点击stop按钮,完成录制:
cpu-profiler录制完成概览
  • 1.选定范围:可以拖动选择想分析的数据部分
  • 2.交互事件:显示用户交互事件,比如点击,旋转等,还显示生命周期的状态
  • 3.应用线程:图形显示用户线程状态,双击具体某个线程可以进入此线程的call chart(调用栈的重新组织和可视化呈现)详情显示
  • 4.分析类别标签(如果大家要详细了解分类标签的区别,直接移步到文章结尾的官网链接):
    TopDown:汇总了具有相同调用堆栈的完全相同的方法的跟踪信息。优势:方便观察其中每一步所消耗的精确时间,也支持按单独维度进行排序,这点同样非常实用
    Flame Chart : 倒置的调用图表,展示调用栈的聚合信息(Flame chart 标签页提供了 Top down 标签页的图形表示方式)。优势:便于发现总耗时很长的调用链
    BottomUp:从底部开始构建,反向构建出树。优势:方便地找到某个方法的调用栈
  • 5.过滤器:搜索过滤,matchCase区分大小写,Regex使用正则表达式
  • 6.事件类型:Wall Clock Time实际经过时间,Thread Time消耗cpu时间
(6.1)解惑环节(只针对旧版用户)

 好了,到了这里,估计有些人就有些疑惑了,这跟我的录制结果不一样啊,最起码长相都变了…时间戳去哪儿了?Call chart去哪儿了?之前是垂直布局显示,现在怎么是整体左右分屏显示?why?
 莫急,莫急,请容我们慢慢缕,先喝一口82年的拉菲…
 第一个问题:为什么长相都变了,因为我用的是AndroidStudio 4.0的版本,如果大家喜欢新版风格,升级以下就行,如果不喜欢,用自己的就行,本质都一样。
 第二个问题:时间戳去哪儿了?其实时间戳还在,只是之前时绝对时间戳,现在变成了相对时间错,比如录了10秒钟,时间戳就是从0s -> 10s。
 第三个问题:Call chart呢?现在怎么是左右分屏显示?因为新版对分类标签页做了优化。在之前的版本中, 你是不是还为 call chart与 其他标签频繁切换而苦恼不已?你是不是在为录制时做了哪些操作而头疼不已?…下面的新版新特性为您解答。
 新版本新特性:
  1. 将之前的Event事件显示窗格,用Interaction窗格替代(对交互事件做了细分,查看起来直观方便方便)
  2. 将Call chart分析窗口与Threads窗口信息进行聚合处理,在具体的Threads窗口选则一个(比如main),双击进入,发现里面就是Call chart分析窗口,这样有个好处是,call chart可以与其他三个分析类别(TopDown/FlameChart/BottomUp)进行联动数据分析,这是我最喜欢的地方。

(7)录制完成分析环节:
(7.1)SamplePop示例代码:
cpu-profiler使用SamplePop代码展示
(7.2)Call Chart
cpu-profiler call chart分析图

 当未选择具体方法时,每个方法会是三种颜色中的一种:

  • 绿色:应用自有方法的调用
  • 蓝色:第三方 API(包括 Java 语言 API)的调用
  • 橙色:系统 API 的调用
(7.3)Flame Chart
cpu-profiler flame chart分析图

 一目了然的可以看出哪个方法的总耗时最长,然后既可以一步步尝试解决掉它(在SamplePop中,很显然是在循环中执行log打印,大量消耗了cpu)

(7.4)Top Down
cpu-profiler Top Down分析图

 有没有什么惊喜的发现,是不是和上面的flame chart一样,以下子就发现了log函数消耗此方法的49.5% cpu,只是 flame chart的图标形式更直观一些。

(7.5)Bottom Up
cpu-profiler Bottom Up分析图

 怎么样,是不是涛声依旧?而且从默认的排序就可以看出,哪个方法最消耗cpu。其实三个分类以不同的方式展示问题,各有优势,适当选择即可。

(7.6)极简模式

 上面分析呢,都是从一个简单的例子来讲述工具的使用,方便大家理解。只要掌握了基本的工具使用和分析方法,再经过项目的实际使用,相信大家就会游刃有余的解决各种问题。
 你是不是以为要结束了?其实并没有…

(8)在应用启动过程中记录 CPU 活动
(8.1)手永远没有机器快,要分析应用的启动过程,全靠它
cpu-profiler 在应用启动过程中记录 CPU 活动
(8.2)然后 Run -> Profiler 启动应用(当应用一启动,则启动了cpu数据跟踪记录)。下面是应用启动后的生成数据:
cpu-profiler 在应用启动过程中记录文件生成
(9)使用 Debug API 记录 CPU 活动
(9.1)当不满足于以上的定位和分析方式,你还想:
  • 精确地控制设备何时开始和停止记录跟踪信息
  • 设备能使用您指定的名称保存跟踪日志,便于您日后轻松识别各个日志文件
    那么Debug API你值得拥有。


    cpu-profiler Debug API trace文件生成
(9.2)然后通过adb命令将trace文件pull出来:
  • adb pull /sdcard/Android/data/com.kejiyuanren.pop/files/kejiyuanren.trace .(这个.表示当前命令窗口的路径)
  • 再用Android profiler将trace文件导入(Sessions窗口有导入按钮)


    cpu-profiler Debug API trace文件导入分析
(9.3)Debug API 是不是很好用?不过还有以下一些点需要注意:
  • 官网说,使用Debug API需要声明外部存储权限,但是我的工程没有声明也照样可以用(尴尬,可能是我用的新版本的原因吧)。
  • 这种方式会使得应用速度变慢,可以通过相对时间来确认优化是否有效果,对比优化前后的耗时间即可
  • trace文件追踪的名字要改变,不然会进行覆盖处理

小编的扩展链接

参考链接

终于结束了,开心的笑吧

举手之劳,赞有余香! ❤ 比心 ❤

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352