美文网首页Android 性能优化
(一)Android 性能优化 Cpu Profiler

(一)Android 性能优化 Cpu Profiler

作者: 科技猿人 | 来源:发表于2020-06-26 18:02 被阅读0次

    小酌鸡汤

    业精于勤,荒于嬉。

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

    小编的扩展链接

    参考链接

    终于结束了,开心的笑吧

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

    相关文章

      网友评论

        本文标题:(一)Android 性能优化 Cpu Profiler

        本文链接:https://www.haomeiwen.com/subject/pxvrfktx.html