(一)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文件追踪的名字要改变,不然会进行覆盖处理

小编的扩展链接

  • SamplePop代码下载
  • 《Android 性能优化 全家桶》

参考链接

  • 谷歌官网 -> 这是应该读的第一篇文章
  • 谷歌开发者 -> 这是深刻理解四种标签页原理的最佳文章
  • 优质博文 -> 这是详细了解工具使用的优秀文章
终于结束了,开心的笑吧

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

你可能感兴趣的:((一)Android 性能优化 Cpu Profiler)