小酌鸡汤
业精于勤,荒于嬉。
本文来源《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文件追踪的名字要改变,不然会进行覆盖处理
小编的扩展链接
参考链接
终于结束了,开心的笑吧
举手之劳,赞有余香! ❤ 比心 ❤
网友评论