Android APP耗电优化的一些经验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tomatomas/article/details/53450364

前言

之前限于表达能力和时间,所以写得挺乱。今天一看这篇文章,已经有600多的阅读量了,也就是说我可能已经坑了600多的读者了,心里想想还是过意不去,所以今天把此文更新一下,聊表心意,希望能带给大家一些真正有用的经验。

动机

之前之所以想写这篇关于耗电优化的文章,是因为我参与开发的APP碰到了高耗电的问题,经常被用户投诉耗电很大、耗电排行第一,虽然是第一,但是想来并不是什么光荣的事情,所以我就很开心的被老大分配了优化耗电问题的任务,后来我也解决了这个问题,并再没有出现过用户投诉,所以想借此宝地跟大家分享一下经验。

经验结论

耗电的大小跟CPU的使用率成正比

我是将物理的手机电流数据跟CPU的使用率对比得出此结论的,并且之后的分析都是基于这个结论的。问题解决之后,我更加相信这个结论是正确的。

触屏时耗电相当高

如果你的APP跟用户交互得比较频繁,那你可能要考虑一下是不是交互频繁导致的高耗电。因为触控屏也算是传感器,设计到传感器的操作都是耗电相当大的。游戏耗电大想必也有触屏的一部分功劳。大家可以使用下面的方法验证看看。

警惕动画

动画的连续变化是由View的不断重绘产生的效果,代价就是CPU或者GPU不断的计算从而导致耗电高,如果可以,不要做长时间的动画或者及时关闭动画,比如转圈的加载动画、后台界面的轮播图。特别需要警惕的是WebView的js动画和css动画,因为WebView加载的H5页面中的动画导致的是整个WebView的重绘,对CPU或GPU的消耗比普通View的动画要大很多。我这次碰到的一个问题就是H5页面最底部一直显示转圈的加载动画而页面滑到底部又会加载新的信息所以一直没有注意到这个问题,后来分析发现这个动画导致整个WebView一秒重绘几十次!这样耗电不高才怪!

如何检测

既然CPU的使用率过高是耗电的罪魁祸首,那我们怎么检测APP的使用率呢?

top命令

在adb shell中使用top命令可以列出系统中的所有进程及其CPU使用率,当APP进程的CPU使用率超过1%的时候,都是耗电比较大的了,正常情况下应该处于0%的值,实际上应该是0点几。对于这个命令,我经常使用的是top -m 5,只要列出前5个使用率最高的进程就够了,一般只有前5个才会有超过%1的CPU占用率。当APP进程的CPU占用率一直低于1%的时候,或者你想定位问题所在的时候,下面更精细的方法可以帮你捕捉到问题的所在。

DDMS工具Update Thread功能

当我们在DDMS工具中针对某个APP进程使用Update Thread功能的时候,会弹出一个窗口,这个窗口上显示了进程中所有线程的列表,还有CPU在其用户空间运行时间utime和系统空间运行时间stime,这个列表每隔几秒就会更新一次。我们要做的就是观察哪个线程的utime和stime的数据增长得快,增长得快表示这个线程占用了比较多的CPU资源,我们就可以具体查看是哪些代码在运行导致耗电高。一点经验:RenderThread增长得快一般是动画导致的。

dumpsys batterystats

这里新增一个分析方法,是我后来才学到的,大家可以进这个链接了解下Android App耗电发热分析

猜你喜欢

转载自blog.csdn.net/tomatomas/article/details/53450364