Android 耗电量测试及排查方法

发表于:2016-9-30 10:10

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:许章毅    来源:51Testing软件测试网采编

  上图为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命令很方便的获取电量了,具体方法如下:
  1、首先通过app的包名获取其PID(Process Identifier):adb shell ps |find “com.baidu.example”,获取的数据第一个参数就是UID,需要将该UID换成标准格式,如下图,去掉下划线即为该app的UID。
  2、通过UID和包名获取该app的自从数据线上次拔插的电量:adb shell dumpsys batterystats “com.baidu.example”  |find  “***”,将***替换成UID即可,如下图,获取到的app的电量为6.47mAh。
  3、如果想看到完整耗电量的数据,可以直接将batterystats的内容保存在本地。
  4、文件里面有很详细的耗电量信息,包括:battery history:哪个应用打开了多少秒,之后做了哪些操作等
  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文件如下,横坐标是时间,纵坐标是每个影响电量指标的参数。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号