引言:电量消耗控制一直是困扰所有APP开发者的一大难题,其中又以Android平台尤甚。业界同行为此做了非常多的研究与尝试,腾讯自然也不例外。本周开始,大讲堂将推出数篇省电系列文章,与大家一起探讨Android开发中的省电窍门,敬请期待。

题外话:

大多数技术同学都有或多或少的分享过一些电量的心得,特别是那些自己组装个硬件去测电流的牛牛们,更是佩服的五体投地。不过在繁忙的版本迭代和铺天盖地的各种需求扑面而来的时候,是否能从容的把握住需求在电量方面的问题,才是大多数测试同学最关心的,毕竟就算是专职测性能的同学也很难在大浪来袭的时候淡定的花几天来拿硬件逐一确认功能点电量消耗。

为什么要这么纠结耗电量?因为手机由很多模块组成,基本上每个会被程序使用的硬件部分都会耗电,且看上面这张一个典型主流智能手机构造图,电池占了将近60%手机空间,甚至超过了PCB的占地面积,也就是说一块电池在维持着整个手机的运作,而且不惜占掉了手机超过一半的体积(除屏幕),所以电池的每一毫安都是有价值的,浪费电量就如同浪费粮食一样可耻。

如何测电量,其实是个极其蛋疼的事情,因为测电量就必须需求到手才能开工,但当需求到手了就算你测出来某某特性多消耗了100mw电量,让他们去改,显然不现实。所以在我看来,测电量的工作最适合的时机是在需求评审和用例评审阶段,也就是用意识流和脑补的形式,让产品和开发在开发前就意识到这么做太耗电,那么做太逆天。

但如何能做到在开发前就规避耗电悲剧,并不容易,一方面自身要对手机功耗有非常全面和整体的认识,另一方面要能拿出数据pk产品开发,能让你的论据站的住脚。

所以我做了一点点研究,并将之分为三个阶段来介绍:

首先,庖丁解牛、面面俱到,数据告诉你什么东西是耗电元凶

其次,工欲善其事必先利其器,主流电量测试工具分析

最后,获取客观事实,如何将电量消耗数据化

首先,所谓庖丁解牛,如字面意思,想把电量测好就要知道电量到底怎么被消耗的,km上有很多很专业剖析非常透彻的文章,如GPU渲染,屏幕色彩等,不过这次let’s down to earth,通过简单明了的数据对比到底什么东西在消耗手机的电量。

OpenGL与硬件加速

关于GPU渲染和屏幕大小以及亮度对电量的影响,我们换个思路,不搞太复杂的东西,用GLBenchmark这款软件来试试市面上中端机型电池的续航能力,横向对比看看什么东西如此耗电。

GLB测试软件主要是通过跑3D游戏来测试电池的消耗,在电池耗尽的时候会生成一张图标,主要分两个维度,一个是电池衰减,一个是FPS变化,下面的数据选用的是EGYPT HD,100%亮度及最大30FPS的模式进行测试。

不过我们先不急着横向对比数据,而是看看Egypt(埃及)这款3D游戏所测试的重点OpenGL ES 2.0对电池的消耗有多大?在此之前先了解一下日常使用的电量消耗数据(数据来自GSMArena)[1]。

 

拥有一块大电池的noteII表现非常不俗,3g通话时长达到17个小时,wifi下浏览网页将近9小时,竟然能联系播放11个半小时的视频(飞行模式).

 

 

再看看电池容量少了1000mAh的s3,相比之下自然差一些了,不过鉴于电池容量本身就中规中矩的情况,续航仍然能满足我们的日常需要。

 

再回头来看GLB的测试结果,表现最好的三星noteII只能坚持4个半小时,只有浏览网页续航时间的一半。苦逼一族如MX2续航仅仅只有两个小时,手机只能用2个小时还能叫做移动设备?根本没法愉快的出门了。所以我们可以轻易得出第一个结论:长时间使用OPENGL绘制3D动画(CPU&GPU)非常非常之耗电。

 

看上去似乎很吓人,不过庆幸的是手Q上并没有什么3D动画的需求,是不是咱就不用关心动画了呢?显然不是的,因为即便是手Q上使用的2D绘制,其中仍然有电量过度消耗的可能。Android中的动画类型有两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

 

乍一看似乎这两种动画类型实现都很简单,但如果你的动画非常之复杂时(仍然是2D),UI渲染的时候,多核是没有意义的,因为渲染必须要在一个进程中完成,无法并行。简言之,手机四核也好,八核也好,碰到复杂的动画如果想得到流畅的效果就得开启硬件加速,因为GPU通常能更好的处理图像的运算。

 

 

另外还得提及GPU的另外一个优势:许多绘制的效果变得更加容易。比如你要以软件形式绘制一个位图,你除了设置一个位移,不能做任何事。仅仅是缩小就得花上相当多的时间进行渲染。而在GPU中,此类转换则相当容易。所以你懂的,开发做动画效果时为了达到更好的效果是非常乐意开启硬件加速的,但实际上使用硬件加速不仅会有多余的内存消耗,以及不确定的异常出现外,仍然通过上面的数据可以得知,使用GPU自然就会带来更多的电量消耗。所以我们得出第二个结论:即使是2D动画绘制,如果开启了硬件加速也会带来过多甚至不必要的电量消耗。

 

屏幕与亮度

 

再看上面的数据,横向对比s3和note2,是否发现电池容量相差1000mAh但游戏续航时间只差了30分钟?原因显而易见,都是note2那块5.5寸的大屏幕导致的,那么屏幕大为什么就耗电呢?

 

最直观的原因是屏幕大显示区域大,自然功耗就高,没错,但还有另外一个原因也不可忽视:PPI。由于S3的AMOLED屏幕是P排,所以PPI有效数值要在换算出来的数值上乘以三分之二,所以有效数值为203.47,note2是RGB排列,有效PPI数值是267.3且不用换算。两者之间最大的差别就是note2需要同时绘制1.3倍于盖世三的像素,也就是说播放一个相同的动画得到相同效果(fps相同),note2对于gpu的消耗是s3的1.3倍。于是我们又得出一个结论:相同的动画,屏幕大小、分辨率及PPI不同,也会有不同的电量消耗。

 

再来看一组数据,仍然使用GLB,这次我们加上iphone4s,以避免android特有问题的说辞。

上面的数据主要是对比相同fps值情况下,不同屏幕亮度手机续航时间的对比,最亮状态跑和50%亮度跑出来的结果有明显差距,s3有20分钟左右的差异,4s有30多分钟的差异,所以我们又得出个结论:屏幕材质耗电量波动不大,屏幕耗电与屏幕亮度有着直接关系。

 

有想法的同学可能已经发现,为何s3和4s之间亮度续航差异仍然有十几分钟的差异?因为IPHONE4S MAXIMUM SCREEN BRIGHTNESS是581cd/m²,而s3是249cd/m²,竟然相差两倍,也就是说4s的50%亮度跟s3 100%效果差不多,所以侧面也印证了亮度坑电量的事实。

 

数据传输

 

能装手Q的自然已都是智能手机,而且大部分情况下都在进行数据传输,那么是否有考虑过手机最频繁进行的工作是否也很耗电呢?手机进行数据传输的核心方式不外乎三种:Bluetooth,WiFi (802.11),cellular networks(eg.2g3g4g)。那么我们继续保持队形,以数据的方式来看看手机在这方面的耗电情况[2]。

 

 

先来看看蓝牙的情况,三条折线分别是蓝牙固定传输间隔时间40ms、470ms、1.2s模式,可以看出传输间隔时间越长越不耗电,每秒传输数据量越大越耗电,不过仔细看竖轴其实功耗并不大,可以说很小,不过先不下定论,继续往下对比。

 

 

这次是WIFI的功耗表现,几条折现分别是固定传输间隔时间15s、30s、60s等等,跟蓝牙情况类似,间隔时间越短功耗越大,到了300s再往后就基本上没什么区别了,wait,你是不是发现了什么?15s间隔功耗竟然超过了300mw!!手Q不是经常会很频繁的收到push消息之类,那不是意味着…稍安勿躁,我们现在只是摆数据,勿谈国事。

 

另外一个维度,每秒传输数据大小对功耗的影响并不大,这点跟蓝牙有很大区别。

 

 

这次是GSM下数据传输的功耗,只有一条线,可以看出每秒传输数据越大功耗就越高,从300bytes/sec开始功耗急剧飙升,1200的时候竟然能有1200mw的功耗,也就是说你在2G环境下传文件,以恒定1.2kb/s的速度传一个1G的文件,如果用的是盖世三,那么不好意思,你还没接到一半大小就没电了…

 

看上去很骇人,而且用的是GSM网络,技术日新月异的发展,是不是到了3/4G时代功耗就没那么变态了呢?那就来见识下已日趋普及的3G的耗电表现[3]。

 

上图数据可以看出,3G在小量数据传输时的耗电量要比GSM明显高很多,但随着传输数据越大越来越趋同,但不论如何都可以得出结论:3G比GSM耗电。

那么即将席卷而来的LTE表现又如何呢?且看下图[4]。

LTE的上行功耗简直逆天了,而且下行也要比3G功耗要高,wifi默默的在下面偷笑…

 

好了,各种对比数据罗列出来后,又到得出结论时间了,这次的结论应该很明显:

 

1、 蓝牙功耗最低,wifi其次,cellular network最高

2、 Wifi传输时间间隔时间越短,功耗越高,且成倍增长

3、 xG下,功耗4G>3G>2G

4、 xG下,每秒传输数据量越大功耗越大,上行跨度特别明显,下行较为平滑

 

GPS、LBS

 

除了CPU、RAM这些起进程就要用到的东西,还有个耗电大头,现在很常用的lbs功能所需要用到的gps定位,估计有人会说调一下gps能耗多少电,这不坑爹么。其实没那么简单,且看下图[5]。

 

 

上图是打开一次google map整个过程中所消耗的电量,其中gps请求开始到收到结果会持续消耗500mw(电量消耗因gps芯片不同有所差异),但同时会打开3g去接收数据,过了一会gps才关闭,然后停止接收数据,在此过程中持续消耗的电量其实相当于叠加了GPS和3G的功耗。整个过程超过按上图55秒来算,平均每秒700wm,s3电池2100mAh,电压4.2v,打开一次google map完整拉到数据,每次消耗掉盖世三3mA电量,就算剥离掉3g的功耗也有将近1.5mA。我们又得出一个结论:单独运行一次gps功耗不大,但会持续消耗,且结合数据业务,将持续消耗较多电量。

 

这次上篇就介绍到这里,综合一下本文数据所得出的所有结论:

 

1、长时间使用OPENGL绘制3D动画(CPU&GPU)非常非常之耗电

2、即使是绘制2D动画,如果开启了硬件加速也会带来过多甚至不必要的电量消耗。

3、相同的动画,屏幕大小、分辨率及PPI不同,也会有不同的电量消耗。

4、屏幕材质耗电量波动不大,屏幕耗电与屏幕亮度有着直接关系。

5、 蓝牙功耗最低,wifi其次,cellular network最高

6、 Wifi传输时间间隔时间越短,功耗越高,且成倍增长

7、 xG下,功耗4G>3G>2G

8、 xG下,每秒传输数据量越大功耗越大,上行跨度特别明显,下行较为平滑

9、单独运行一次gps功耗不大但会持续消耗,且结合数据业务,将持续

 

消耗较多电量。

 

[1]GSMArena Battery Test website,http://www.gsmarena.com/battery-test.php

[2]R. Balani, “Energy consumption analysis for bluetooth, wifi and cellular networks,” in Technical report, Dec. 2007, pp. 1–6

[3]N.Balasubramanian,”Energy Consumption in Mobile Phones: A MeasurementStudy and Implications for Network Applications”, In IMC (2009), pp 7.

[4] J. Huang, F. Qian, A. Gerber, Z. M. Mao, S. Sen, and O. Spatscheck,A Close Examination of Performance and Power Characteristics of4G LTE Networks. In Mobisys, 2012.

[5]M. Kjasrgaard. Location-based services on mobile phones: Minimizing power consumption.Pervasive Computing, IEEE, 11(1):67–73, 2012