上图为2016年6月Google更新的Android系统分布图,显示运行每个Android版本的活跃用户比例,由上图得知,5.0及以上系统占比正在加大,而4.X占比依然是最多的,所以耗电量分析也要从4.X和5.0级以上的系统来研究。 Android应用耗电量一直是比较麻烦的,也是大家所关注的问题,在4.4系统之前,google一直没有相关API暴露给外面,所以要研究4.4系统以前的耗电量,就需要研读Android的源码;5.0之后的系统,就可以使用adb命令直接获取。 Android电量获取源码分析源码中到底哪个部分是真正计算耗电量的呢?首先打开Android系统源码,找到设置的activity中的电池的部分,也就是”com.android.setting.fuelaguge”这个包里面的PowerUsageSummary类,该类是筛选耗电量最多的前十个应用,而真正计算app的耗电量的是BatteryStatsHelper这个类中的processAppUsage,所以只需要研究processAppUsage这个类的具体实现方法就可以解开我们的疑惑啦~ 仔 细查看 BatteryStatsHelper 中的 processAppUsage这个类,就可以看出,每个app的耗电量主要由以下几个方面决定:cpu的耗电量、wakelock的耗电量、wifi的耗电量、移动数据的耗电量和其他传感器的耗电量。 CPU的耗电量计算
如上图源码,cpu的耗电量为cpu的运行时间和cpu每秒耗电的乘积(里面值得注意的是CPU的速度分为几个档次,每个档次的每秒耗电不同)。 Wakelock 耗电量统计
如上图源码,wakelock的耗电量为partial wake locks的次数和每次wakelock的耗电的乘积。WakeLock是一种锁机制,只要有人拿着这把所,系统就无法进入休眠阶段。其实android系统有多种类型的wakelock,partialwake lock、screendimwake lock、screenbrightwake lock和fullwake lock四中,四种wakelock的共同的都是保持CPU运行,但是屏幕和键盘灯有区别,这个源码中,只计算了partialwake lock这一种情况,而且只计算了其中的cpu的影响。 WIFI耗电量计算
Wifi的耗电量包括三个部分,一个是wifi流量、wifi维持耗电量和wifi扫描耗电量,最重要的还是wifi流量耗电量。 移动网络耗电量计算
4.4的源码中,移动网络的耗电量,是根据移动网络的上传和下载的流量之和与每字节流量的耗电量的乘积。5.0及以后的版本,移动网络的耗电量是根据packet个数来计算耗电量。 传感器耗电量计算
传感器耗电量计算方式为各种传感器的单位时间耗电量(multiplier)和运行时间(sensorTime)的乘积之和。不过GPS传感器和其他传感器的单位耗电量计算方式不同。 dumpsys batterystats获取电量 Android5.0后,就可以直接使用adb命令很方便的获取电量了,具体方法如下:
Per-PID Stats:每个应用的wake timeEstimated Power User:里面包括每个应用的耗电量 (上面方法就是获取该耗电量)
还有All kernel wake locks和All partial wake locks等 也可以通过该方法获取竞品的待机耗电量和相同操作下的功能耗电量,与自身app进行比对。 耗电量高的排查方法 由以上分析每个App的耗电量主要由以下几个方面决定:cpu的耗电量、wakelock的耗电量、wifi的耗电量、移动数据的耗电量和其他传感器的耗电量,而从dumpsys batterystats中获取的是App的总耗电量,怎么区分到底是哪些部分更耗电呢? 介绍2款App,适用条件:手机需root 一个是google公司研发的功耗分析的工具PowerTutor,优点是可以在将数据在同一环境下与竞品的数据进行比对,可以方便的开始记录,并且可以导出log,log每分钟记录一次所有应用的功耗,包含了LCD,CPU,GPS,3G等产生功耗,缺点是PowerTutor并不通用,只实现了3中机型:G1、G2和Nexus One,其余的机型都归为Unknown,数据可能不够精确,如果测试条件允许的话,还是最好使用支持的机型,apk直接在应用市场中搜索下载。 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|