上图为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系统源码,找到设置的activity中的电池的部分,也就是”com.android.setting.fuelaguge”这个包里面的PowerUsageSummary类,该类是筛选耗电量最多的前十个应用,而真正计算app的耗电量的是BatteryStatsHelper这个类中的processAppUsage,所以只需要研究processAppUsage这个类的具体实现方法就可以解开我们的疑惑啦~ 仔细查看BatteryStatsHelper中的processAppUsage这个类,就可以看出,每个app的耗电量主要由以下几个方面决定:cpu的耗电量、wakelock的耗电量、wifi的耗电量、移动数据的耗电量和其他传感器的耗电量。 如上图源码,cpu的耗电量为cpu的运行时间和cpu每秒耗电的乘积(里面值得注意的是CPU的速度分为几个档次,每个档次的每秒耗电不同)。 如上图源码,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流量耗电量。 4.4的源码中,移动网络的耗电量,是根据移动网络的上传和下载的流量之和与每字节流量的耗电量的乘积。5.0及以后的版本,移动网络的耗电量是根据packet个数来计算耗电量。 传感器耗电量计算方式为各种传感器的单位时间耗电量(multiplier)和运行时间(sensorTime)的乘积之和。不过GPS传感器和其他传感器的单位耗电量计算方式不同。 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直接在应用市场中搜索下载。 另外一个是BetterBatteryStats,该工具是asksven研发的,主要是用来检测待机情况下,每个应用对手机电池的影响,该应用主要分wakelock、alarm、network三种情况下每个应用的情况,可以用该应用来初步判定App电池耗电的主要原因,在alarm数据中,显示每个应用自手机开机被唤醒的次数,占比,点击某个应用,会显示该应用的耗电最多的操作;network数据中,会显示每个应用通过网络传输数据的字节数和占比,如下图: 介绍一个google工具,battery history,适用条件:5.0及以上手机。 需要下载batteryhistory相关的脚本,具体步骤:首先进行初始化操作,打开电池数据的获取以及重置(下图步骤1/2),然后进行一些操作,手动或者自动化都可以,经过一段时间后,获取bugreprot信息,并将其转化为html文件(下图步骤3/4) 打开html文件如下,横坐标是时间,纵坐标是每个影响电量指标的参数。 如果你看的意犹未尽,如果你想随时随地充实自己,请登录MTC官网(mtc.baidu.com),可以获取更多技术类干货,还有精彩活动与你分享~ 百度移动云测试中心简称MTC(Mobile Testing Center),基于众包模式和云技术,为每个App提供一站式测试服务。针对不同开发阶段、不同团队规模提供定制化解决方案,不论是0测试团队,还是追求极致用户体验的产品,让创业者从此告别App开发过程中面临的缺设备、缺人力、缺技术囧境。 拥有千人测试团队,上万台真机; 专注App测试领域,提供全面兼容测试、深度性能测试; 拥有海量用户资源,支持功能测试、探索测试、问题定位测试。 MTC 精益求精的开发者最终的选择! |
|