Android性能优化之耗电优化

作为移动设备,电池重要性不言而喻,设备没有电那就真的只能拿来砸核桃了。所以作为开发者的我们,为了给用户带来更好的体验,耗电优化一直是我们撇不开的话题。

1、为什么耗电

Android性能优化之耗电优化_第1张图片
屏幕快照 2017-03-23 下午2.51.24.png

通过上图先把用户-电量这一流程抽象出来,设备的耗电根本原因在于对硬件的使用,耗电越严重说明对硬件使用的越频繁。用户对app频繁使用说明了你用户黏性做的好,我们不能左右,所以我们要在app对硬件调用上做优化来达到节省电量的目的。

先看下移动设备元件耗电大户有哪些:


Android性能优化之耗电优化_第2张图片
fullsizerender.jpg

2、屏幕

屏幕是耗电最大元件之一,但是用户要和app交互就要点亮屏幕,有人可能会觉得屏幕的明暗是用户自己根据喜好设定的,我们无可奈何。其实不然,在有些时候是可以通过UI的设计来减少屏幕电能消耗的。

在这之前我们先来看下目前常用手机屏幕材质:LCD和LED(OLED)。

  • LCD概述
    LCD又名液晶显示屏,屏幕由成千上万液晶分子负责像素显示,并通过背光来将其照亮。所以说每个像素点都使用了同一个光源,每个像素消耗的电量是相同的。
  • LED概述
    LED每个屏幕像素都可以看成是一个LED灯,由RGB三种颜色共同呈现,不同颜色能量消耗也各不相同。黑色不使用任何颜色,不消耗能量,白色相反使用了所有颜色且亮度高,所以能量消耗也更多。

优化方案:较暗的颜色比明亮的颜色更节能,所以在很多留白的地方可以考虑使用偏暗的色调,当然这要在不影响用户体验的前提下。

3、无线网络

无线网络主要是WIFI和移动运营商网络,通常情况下使用移动网络要比WIFI耗电要多一些。

  • 移动网络
    移动网络数据传输有3种状态:
    Full power:高功率状态,网络激活,允许设备以最大传输速率进行传输。
    Low power:低功率状态,传输速率低于15kbps,耗电是Full Power状态的一半,一般不能直接从程序中进入该状态,而是由Full Power状态降级进入。
    Standby:�空闲状态,没有数据连接需要传输,耗电最少。

这三种状态有一个转换流程:

Android性能优化之耗电优化_第3张图片
mobile_radio_state_machine.png

可以看出,三种状态耗电不同,要使耗电最低应该尽量保持状态在空闲或低功率下。从空闲状态转换到高功率状态需要2s,从低功率状态转换到高功率状态需要1.5s。应用中每创建一个网络连接,网络射频都会转到高功率状态,数据传输完毕降回低功率状态,降回过程需要5s,这5s耗电量保持在高功率状态,低功率降回到空闲状态需要12s,期间一直保持低功率状态。所以每次的数据传输都将导致将近20s电量的消耗。

  • WIFI网络
    WIFI在active状态下有4种模式:低功率、高功率、低传输、高传输。
    当从低(高)功率状态传输数据时,WIFI会暂时进入相应地低(高)传输状态,一旦数据传输完毕就回到初始状态。

WIFI耗电是受包率(每秒接收和发送的数据包)和网速因素影响的。如果因素良好,即网络良好时,数据传输的很快,所以WIFI的高功率状态维持时间很短。这也就是为什么说移动网络耗电高于WIFI耗电,因为同样的数据大小传输时,移动网络固定状态转换就需要近20s的电量消耗。

通过上面了解网络连接过程,应该心里有了大概的优化建议。

  • 网络优化方案:
    • 减少网络高功率保持时间:
    • 1.文本和文件压缩传输。
      不管发送还是请求数据,在数据传输过程中使用gzip将数据进行压缩。经过压缩的数据需要更短的时间传输即可完成,这样是无线所处的高功率状态时间更短,从而减少了耗电。
    • 2.精简文本文件。
      所谓精简就是去掉文本中空行、空格、注释等无意义内容。
  
   A Sample Page 
   
    with some sample text 
    <--do more here--> 
   

精简后

   A Sample Page  with some sample text <--do more here-->  
- 3.根据显示大小从服务器获取图片

①请求一个图片时,客户端提供一个分辨率大小,服务器根据分辨率把裁剪缩放后的图片给客户端返回。也可以使用Android端使用Bitmap.Option自行获取缩放的图片
②使用webp图片。

  • 减少网络请求次数
    • 1.使用缓存。
      把经常使用的文件缓存到本地,如头像icon、好友信息等。以后很多时间都可以直接从本地读取缓存减少网络请求次数。

    • 2.移动网络下最好批量执行网络请求,利用一次高功率状态执行尽可能多的事情,从而减少频繁间隔请求导致状态转换消耗更多电量。

4、CPU

cpu利用率高和cpu的频率高没有必然关系,这取决于cpu调频策略。高利用率和高频率的cpu都会导致高耗电。

  • 浮点运算比整数运算相对更消耗cpu时间片,相应耗电也就增加,因而在编码过程尽量减少浮点运算,例如使用位移代替除法。

  • 避免wakelock不正确使用
    wakelock可以唤醒设备也可以阻止设备休眠。在PowerManager类中谷歌已经声明了:这个类会影响设备电量,除非必须,否则尽量不要使用该类,同时使用完毕要尽快释放。wankelock有几种类型,在使用时注意选择正确地类型。

  • 使用JobScheduler
    很多时候为了满足我们的需求而没有考虑cpu的感受,为了执行1s中的数据区唤醒cpu,但实际却消耗了约两分钟的电量。为此谷歌在5.0系统下提供了JobScheduler组件,使用场景:
    必要不紧急,可延迟执行的任务,比如数据块更新,bug日志上报。
    耗电大德任务,如备份在充电时执行。

  • Doze模式

Doze模式通过限制应用访问网络及其他一些操作频率,从而减少cpu开销达到省电目的。在6.0系统上未连接电源、屏幕关闭就会进入Doze模式。但是为了不影响应用正常工作,系统还会周期性退出Doze,在退出期间去执行那些被挂起的任务,这个时间窗口称作维护窗口。

5、其他优化

  • 传感器
    每个传感器都有最大信号频率,开发者在使用传感器时要设置合适的采样频率。最后在使用完成后一定要进行注销,否则激活的传感器会一直进行检测,造成cpu负载和电量消耗。

后面的章节会写一些关于电量检测分析工具的使用。

为了耗电优化干的这些活用户感知不到,但是如果不去优化,肆意使用,那用户就很容易感知到了。

你可能感兴趣的:(Android性能优化之耗电优化)