如何才能准确测量 APP 的功耗?

时间:2022-04-28
本文章向大家介绍如何才能准确测量 APP 的功耗?,主要内容包括直接读取手机硬件功耗、读取/proc, /sys文件、通过BatteryStats class等、如何直接读取手机硬件功耗?、回过头再总结一下:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

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

上篇文章罗列了很多数据,除了通过评测软件跑出来的数据外,还有些实际功耗数据,这些除了用power monitor硬件设备以外,还有是通过软件测出来的。有同学可能要挑战了,除了power monitor,其他软件形式的电量数据都是不可靠的,这种数据拿出来是没有说服力的。挑战的很好,为什么这么说,先来分析下几种可行的电量测试方法:

直接读取手机硬件功耗

-数据非常精确
-无法区分不同硬件模块的功耗
-依赖处理器架构(后面会说)

读取/proc, /sys文件

-数据更新频率问题

-其他模块无效,如gps、cellular、display等

通过BatteryStats class等

-数据更新频率问题

-数据颗粒度的问题

-这只是个Java class…

如何直接读取手机硬件功耗?

方法不多,有如下几种: 用电源模拟电池给手机供电,再实时监控,非专业人士这种方法可以直接pass了,投入产出比太低了。

用如monsoon power monitor的硬件设备接在手机电源上来测功耗,仍然太麻烦,而且设备太贵啊有木有,继续pass。

而且上面硬件方式最大的问题是区分不了不同硬件模块的功耗,无法实现精准测试数据。

那么读取/proc, /sys文件的方式呢?这种就更不靠谱了,首先这种方法无法给出实际功耗,也无法解决更新频率问题,另外最重要一点,如gps、cellular及屏幕等模块是没有任何数据可以使用的。当然,这些数据还是非常有用的,不过只能作为辅助功能。

通过BatteryStats、BatteryService等Battery驱动程序都是用的Linux标准的Power Supply驱动程序与上层sys文件系统做接口,主要用于读取sys中电池相关的文件信息。现在大部分电池管理软件都是基于这个实现的。包括无线部门非常牛x的专项工具GT中所提供的电量检测就是读取power_supply/battery下面数据来实现的,不过局限性较大,除了不能分模块以外还对机型有要求(原因后面解释)。

不得不提的PowerTutor

如上图表面上似乎PowerTutor已经超脱于上面所说的各种局限了,他能检测不同模块,而且给出功耗数据。但他的能耗估计实质上是估计功率,再根据功率和时间乘积算出能耗,也就是说最终检测到的功耗数据是估算出来的,而非真实功耗。不过PowerTutor得出的数据其实跟实际数据是非常接近的[1],下图是跑google map和youtube估算结果跟实际测量的功耗,从曲线上看差不多。那是否用PowerTutor就能帮助我们实际展开电量专项测试了呢?

从他的代码来看,功率的计算主要是由PhonePowerCaculator接口定义的,而且根据不同的机型实现了不同的接口,比如getThreegPower函数,只是根据目前3G接口的状态,返回该状态下的固定功率。而固定功率以硬编码的形式固定在DreamConstants.java中,这些固定功率应该是使用专门的设备进行检测出来的[2]。也就是说除了G1、G2和Nexus One,PowerTutor并不能保证准确性。而且可惜的是虽然他们官网表示会支持更多手机类型,但现实是残酷的,他们已经3年没有更新代码了,而且几个主创人员要么毕业工作了,要么换课题了,基本上可以宣告他已经烂尾了。

App电量问题其实在业界也一直困扰着很多同行,这不我在四处寻觅时看到了一位同学,也在寻觅着称手的兵器。

这位同学在跟谁讨教呢?原来是在牛X的Qualcomm公司技术论坛,向他们的产品经理请教电量工具的问题,请允许我为大家介绍Qualcomm移动设备监控工具Trepn Profiler。

trepn profiler的工作原理Qualcomm并没有太详尽的介绍,但其实也并不复杂,如上图,软件通过SnapDragon800+系列移动芯片架构中所使用的特殊EPM电路以及电池电量计芯片(如DS2780 、MAX17048等)直接获取电流数据,可以理解成SnapDragon800+系列芯片专门在如每个cpu核心、数字核心、电量监控等处build in了多个sensors,当开始运行trepn profiler时sensor就开始工作,并将数据通过图表形式展现出来,基本上可以算是从硬件直接获取的数据了

说到这里有必要简单介绍下fuel gauge IC(即电量计芯片),因为手机需要确定电池的可用电量以及充电状态(SOC),主要是根据剩余电量与电池容量的比来确定的,而手机电池经过多次充放电导致电池容量变化,以及电压与电量之间不存在明确的关系。所以为了达到足够高的电量计量精度,引入了fuel gauge IC,下图是现在使用比较广泛的MAXIM DS2786[3]。工作原理就不详述了,有兴趣的自研,市面上一般不是MAXIM的就是TI的,资料都在官网。

不过也基于依赖fuel gauge IC获取数据的原因,电池类型不同芯片肯定不同,手机不同芯片也有可能不同,所以某些设备的数据并不准确,如已知以下几款(发现木有都是三星啊…):

· Samsung Galaxy S III (SCH-I535)

· Samsung Galaxy S4 (SCH-I545)

· Samsung Galaxy S5

· Samsung Galaxy Note II

· Samsung Galaxy Note 3 (SM-N900V)

· DragonBoard (all versions)

· Inforce IFC6410 SBC

推荐使用以下几款经Qualcomm测试确认数据无误的手机:

· Google/ASUS Nexus 7

· LG Nexus 4

· LG Nexus 5

· HTC One (2013)

· Sony Xperia ZL

· HTC Droid DNA

· LG Optimus G Pro

说到这里就可以回答一下为何专项工具GT随身测对有机型要求,因为其中也用到了实时获取电流来判断电量损耗的方法,其中说到经试验暂时只在nexus 1和4上可用,其实也是跟fuel gauge IC有关,太子1和4可用是因为android原生支持的原因。

再回到软件本身,鉴于上面介绍的实现原理,我们可以确定trepn profiler的数据是可靠准确的(相较其他非硬件检测类方法而言),虽然他也无法区分各个模块的功耗(MDP工程机支持分模块监控,手头无设备,详情见附录),但他的优势在于他能同时监控其他硬件指标,于是我们可以从侧面来印证各模块的功耗,先加载检测所有可能相关的硬件模块,通过曲线图来判断电量走势与哪些硬件使用关系最大。

比如下面这张我用谷歌地球的情况,同时检测电量功耗、cpu、gpu、gps、wifi以及屏幕的使用情况可以看到中间有一段时间电量基本再低谷,而其他曲线除了cpu外基本上也是平的,就可以分析得出这段空闲时间cpu使用并不影响多少电量,相反可以发现电量曲线跟粉红色曲线很相近,再仔细一看原来粉红色曲线是GPU使用,那就难怪了。当然我这个图截得不好,纵轴其实是可以以mW为单位的。

所以通过trepn profiler检测到的数据,再加上些个人分析,基本可以满足我们电量专项测试的需求了。不过如果买一台SnapDragon MDP工程机,再用trepn profiler的话还能支持查看各模块的电流、电压情况,再加上已知的功耗及模块对应关系,其实就可以估算出比较准确的各模块实际功耗情况了。但手头没有MDP工程机,只是个人猜测而已。

另外比较令人兴奋的是,trepn profiler还支持eclipse插件,开发测试两相宜。

当然强大的Qualcomm公司可不止只有这点能耐,对于他们的OEMs或合作伙伴,他们有更强大的QEPM电量监控软件,不过实在难以一睹真容,找了张图权且看看,似乎是一整套性能检测方案,通过web端实时查看数据。但考虑到获得授权的可能性,还是作罢了

回过头再总结一下:

硬件检测电量测试方法:相比用power monitor这种东西,用Qualcomm的trepn profiler来完成,简单方便而且无成本,最重要的是检测结果是准确可靠的。而且如果能搞一台MDP能得到更详尽和精确的数据。主要问题是存在机型适配的问题。

通过读取系统文件方法:首先也存在机型适配问题,其次频率、支持模块都存在问题,最重要是数据并不能保证准确性。不建议用以做电量专项测试。

通过电量消耗模型估算的方法:以PowerTutor为代表,可以检测不同模块的功耗,而且数据准确度较高。但对不同机型要有不同模型适配(主要是固定功率),而且软件已停止更新。所以如果用适配机型来测电量还是可以接受的,其他机型还是算了。

所以现在看来MDP工程机+trepn profiler是最可行的一种方案,甚至直接只使用trepn profiler的话也不失可行。

但别忘了PowerTutor,虽然他已死,但他的实现方式及思路是非常值得借鉴的,有个韩国棒子称PowerTutor为state of the ART,他将这门art发扬了下去并且做得更好,不过本文暂且不表。

附录(Snapdragon 800(MDP工程机)支持的电量测量范围):

Power Stats are measured in mW or mWh. Power Stat values are given as adjusted values relative to the baseline measurement. Battery Power values can be set to relative values or raw values by toggling the Show Deltas preference. Trepn Profiler captures different power statistics depending on the hardware.

Follow the device links for a list of corresponding Power Stats:

On this device, power/current values are available for: n Audio – Power consumed by the audio codec n Battery Power – Power consumed by the whole system from battery n Battery Status – Charging status of the battery; automatically selected when the Battery Power data is selected, but not selectable individually ¨ 0 – Not Charging ¨ 1 – Charging (USB) ¨ 2 – Charging (AC) ¨ 3 – Charging (Generic Source) CPU – Power consumed by the CPU Camera – Power consumed by the camera Codec/GPS/Wireless – Power consumed by the codec, camera, GPS, and wireless Digital Core/SD Card/USB – Power consumed by the digital core, SD card, USB Graphics – Power consumed by the GPU Internal Memory – Power consumed by eMMC memory LCD Backlight – Power consumed by the display backlight SD Card – Power consumed by the micro-SD card USB – Power consumed by the USB WLAN/BT/FM – Power consumed by Wi-Fi, Bluetooth, and FM radio


[1] L. Zhang and et.al., “Accurate Online Power Estimation and Automatic Battery Behavior Based Power Model Generation for Smartphones,” in Proc. of CODES+ISSS, 2010.

[2] https://github.com/msg555/PowerTutor

[3] www.maximintegrated.com