Android下网络接口能耗估计原理

最近做一些手机能耗方面相关的工作,研究了PowerTutor的源代码,本篇日志剖析其中的3G和WiFi能耗估计与测算的方法。

能耗估计实质上是估计功率,再根据功率和时间乘积算出能耗。

PowerTutor的GitHub地址:https://github.com/msg555/PowerTutor

下载源码导入项目,跟踪一下函数,发现功率的计算主要是由PhonePowerCaculator接口定义的,PowerTutor根据不同的机型实现了不同的接口,详细有G1 G2 和Nesux One。

以G1 为例,跟踪DreamPowerCaculator里的代码,简单的分析getThreegPower函数,发现只是根据目前3G接口的状态,返回该状态下的固定功率而已。固定功率以硬编码的形式固定在DreamConstants.java中,这些固定功率应该是使用专门的设备进行检测出来的。

3G接口的状态跳转如下:

3G接口的状态由ThreegData来进行计算,跟踪ThreegData可以发现,在代码里通过文件系统得到3G接口收发包的数量,计算出收发包的速率,进而估计3G接口目前处于哪个状态。估计的方法也很简单,速度〉0,则处于DCH,若之前出于DCH且速度为0,则根据一个timer决定是否跳转到FACH,若速度为0且在idle,则根据Timer决定是否跳转到idle。Timer的设置根据手机不同而不同,也存储在Constants中。注意默认的interfacename 为rmnet0,如果手机的3G接口名字不是rmnet0会导致查找相应文件系统查不到数据,具体的接口名称可以使用netcfg命令查看(在adb shell里或者各种android终端软件)。

 

WiFi的计算相对复杂一些,首先判断WiFi所处的状态,同样是使用类似的估计法,具体的方法是判断上一个迭代周期内收发包的个数,若小于4则为低能耗状态,大于15则为高能耗状态,否则维持不变,一个迭代周期默认是1000ms,硬编码在代码中。接着在getWifiPower函数中判断所处的状态,如果是低能耗态,则返回低能耗态的功率,是个常量。若为高能耗态,则总功率为高能耗态的基本功率加上传输速度*该传输速度下的额外功率。给定传输速度下的额外功率以表的形式存储在常量中,高能耗态的基本功率和低能耗态的基本功率也存储在常量中。

 

值得注意的是,计算WiFi功率是不分上行下行速率,换句话说所谓的传输速率是上下行速率之和,虽然从硬件来讲,上传资源消耗的能量要多一些。

 

结论:目前很大一部分测能耗的软件实际上并不是得到设备的真正能耗,而是根据某些模型和先验数据来进行能耗的估计,估计得准确程度依软件不同而不同。但普通用户没有去判断此软件偏差的能力(比如拿万用表测电池两端电流与电压),因此将模型估计值当作真实值去使用也没有什么不妥之处 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值