背景
在一个页面改版后,页面停留平均功耗从改版前360mmA上升到460mmA。功耗严重上升,需要优化才上线。
原理先行
功耗影响的要素
CPU
所有的cpu计算都是消耗电量的。主要包括:数学运算,浮点运算比较耗cpu资源,尽量使用移位代替。尽量避免使用算法复杂度的算法。最为典型的就layout布局:如果多嵌套一层,算法复杂度就越高,需要多次执行onMeasure,onLayout和onDraw。这样情况应该使用约束布局或者相对布局减少嵌套层数。
cpu分析:
通过Android studio-view-tools Windows——Profiler可以查看cpu的具体执行情况
发现功耗异常时,首先可以查看cpu的执行情况。通过Record记录cpu的执行方法详情。
- 如果是停留页面,那么所有的线程应该都是空闲,否则都是功耗异常,需要优化
- 如果存在页面更新,可以开发者模式-显示面更新,查看更新区域是否已经是最小区域
屏幕
屏幕是耗电最大元件之一。显示基本所有的手机屏幕都是LED类型。LED每个屏幕像素都可以看成是一个LED灯,由RGB三种颜色共同呈现,不同颜色能量消耗也各不相同。黑色不使用任何颜色,不消耗能量,白色相反使用了所有颜色且亮度高,所以能量消耗也更多。而且根据实践,透明度需要消耗更多的内存,cpu计算和待机功耗
在待机功耗中,使用偏暗色的颜色,能够明显降低功耗。
网络、定位、传感器和定时任务等
数据网络比wifi更新耗电。定位和传感器等在使用过程中都会耗电。使用JobScheduler代替wakelock。
过程分析
- 知道页面停留功耗增大后,立刻使用Android Profiler分析cpu的执行情况。发现并没有任何log和线程执行情况,也没有页面更新。确认不是cpu、网络、定位和界面更新等等可执行情况
- 考虑到屏幕的情况,应该和布局有关系。采用二分法和控制变量法。经常统计,其他页面也存在功耗异常问题。而他们的共同点,是多新增了几条横线。果然在删除掉几条新增的横线时,功耗立即回归到360mmA左右。
- 但是UI效果需要这几条横线,怀疑是横线的实现方式有问题。分析代码,发现横线使用了shape,并且使用了8位颜色值。修改成6位颜色值后,立刻功耗优化了60mmA.
- 还是超标了40mmA。再次查询原理,对比前后的ui界面,发现白色区域高度增加了160dp。把之前的界面拉伸160dp后,发现改版前电流增加了20mmA
- 还是超标了20mmA。再次分享横线的实现方式,发现横线view启用了软件加速(LAYER_TYPE_SOFTWARE)。去掉之后,再次优化了20mmA,达到标准。软件加速,是因为虚线才需要软件加速,但是普通横线并不需要。
总结
功耗异常,可以通过查看cpu执行情况和布局方式逐步定位。在实际中,耗电统计需要专门的仪器。普通开发者最简单的方式是通过手机的耗电统计。
本次主要经过:去除透明度——分析颜色值明暗——去掉软件加速。实现了页面停留功耗从100mmA到0。