背景

    最近测验测验APP的一个功用,发现点击页面上的按钮后,CPU占有率比之前的版别要高,达到了4%,之前的版别只有不到1%。由于两个版别之间代码提交特别多,无法直接经过代码变化来比照剖析。只好直接经过AS东西profiler来剖析运用CPU占用了,看下如何优化。

剖析过程

    首要从测验同学口中知道了CPU占用出现异常的场景是点击页面上的功用A的按钮。OK,那咱们就从点击这个按钮下手。首要翻开Profiler,挑选对应的APP进程,开端监听当时进程的CPU占用率。

记录一次解决Android 高CPU占用率的问题

    双击CPU一行,咱们进入到CPU概况页面,如下:

记录一次解决Android 高CPU占用率的问题

    能够看到在左侧,有4个选项,且下方有record按钮。这儿的意义是,咱们经过点击record后,profile会开端记载接下来一段时间内,具体的CPU占用信息,记载哪些信息呢,经过上述四个选项供咱们挑选。

  • Callstack Sample

    会显现当时这段时间内,涉及到的进程以及调用栈都有哪些,会精密到进程和具体代码。

记录一次解决Android 高CPU占用率的问题

  • System Trace

    会显现具体的信息,包括VSYNC UI制作信号,内存占用(不是具体内存占用),各个线程的运转时间和CPU占用。也会准确到代码,可是不会特别具体。适合剖析record中等时长的数据。此外这儿包含的信息会很多,有助于先手剖析。

记录一次解决Android 高CPU占用率的问题

  • Java/Kotlin Method Trace

    内容更具体,会精密到各行代码,可是这个不适合record抓取太长时间的文件,由于AS剖析会占用很长时间。

记录一次解决Android 高CPU占用率的问题

    咱们先挑选SystemTrace,点击Record开端记载信息,咱们接着点击功用A按钮,开端复现问题场景,问题复现,点击Stop按钮停止抓取,接着AS会自动解析文件,生成咱们具体信息,如下图:

记录一次解决Android 高CPU占用率的问题

能够看到UI的改写VSYNC信号改写很频繁,对应下方主线程代码,存在不少峰值。咱们扩大下方代码峰值,找到最下方峰顶代码,

记录一次解决Android 高CPU占用率的问题

能够看到下方在layout中,不断的obtainview,这儿有可能是一个列表,ListView或者rectclerview,在不断的更新数据。

咱们接着抓一份Java Kotlin Method Trace剖析看下:

留意这儿要点开:

记录一次解决Android 高CPU占用率的问题

然后咱们随意找到一个峰值,查看其代码源:

记录一次解决Android 高CPU占用率的问题

这儿能够直接直观的看到定位到了咱们的代码,LogViewer控件,咱们点进去查看源码,会发现里面定义了一个listView。这个ListView的功用是在APP上显现logcat日志,当点击功用A按钮时,会发生大量日志,然后每次需求打印一行日志时分,就会全部更新listView的一切控件,(代码内容不方便粘贴)所以形成APP UI制作高频率进行,导致CPU的占用率居高。

定位到问题了:ListView不断的改写UI,导致VSYNC不断的触发制作,导致CPU占用率高

解决问题

现在咱们定位到了问题所在,那么怎样解决呢?

第一步,极点化,直接去掉对应UI

    首要咱们最直接的方法便是把这个UI直接屏蔽掉,不去初始化以及展示这个UI。

这种处理下,咱们看下数据,如图,很明显,VSYNC触发周期长了,UI制作频率下来了,交给测验一看,CPU占用率降到了1.1%, 直接降了3%。

记录一次解决Android 高CPU占用率的问题

可是直接去掉这个UI,其实不是很妥,究竟这样相当于这个UI需求给废了。 咱们从ListView代码下手,ListView会发生很多个子View,在咱们这个需求中,需求显现logcat日志,意味着,每一行日志都会新生成一个view放入到logcat中,日志越打越多,view目标也越多。不仅UI制作频繁,内存也会持续上升。所以这儿想优化只能减少view的个数,可是,日志内容不能少,个数怎样减呢?比如把一切内容做一个整体,作为一个字符串显现到控件中,但这样就不需求listView了,直接一个TextView即可。咱们试下这种方案。

第二步,尝试TextView替换listview实现需求

将布局替换为TextView,经过textView的append特点来实现追加日志内容。能够看到作用出奇的好,VSYNC信号不会很频繁,且没有生成多余的目标。

功能狗测验了一下,CPU占用率为1.7%。

记录一次解决Android 高CPU占用率的问题

可是TextView也有坏处,关于数据的操作没有listView和recyclerview那么精密化,假如由于事务需求,仍然想用listview怎样办呢?

第三步,尝试优化listView

实际需求中,假如咱们绕不开listView,那么就只能想办法去优化它了。从之前的数据来看,是由于UI改写太频繁,那么咱们下降UI的改写频率呢? 这儿改动了一下代码:缓存日志信息,每过500ms才去改写UI,将缓存的日志显现到listView中,这样改完后,看下作用:

记录一次解决Android 高CPU占用率的问题

有一些好转,运用功能狗测验下,看看,成果CPU占用率为2.4%,也优化了不少。

总结

关于这种问题,利用好东西profiler对程序进行剖析。能够快速找到问题原因的基础在于对东西的熟练程度,关于AS东西的运用,能够直接参考官方文档的介绍:developer.android.google.cn/studio/prof…