移动性能测试 [小记] Android 获取详细功耗

shixue33 for 平安科技 · 发布于 2017年09月13日 · 最后由 stayhungry 回复于 2017年09月19日 · 1143 次阅读
本帖已被设为精华帖!

Android系统 >= 5.0

清空耗电数据

adb shell dumpsys batterystats --rest

获取电量数据

adb shell dumpsys batterystats >battery.txt

battery.txt 各个数值的意义参考 https://developer.android.com/studio/profile/battery-historian-charts.html#FilteringBatterystats

其中关键词Estimated power use (估算电量)下有具体uid的耗电,uid根据文本头部通过进程名可以筛选到。

另外,根据uid,还可以找到流量数据,alarm和唤醒次数,等等。

比如:
第一行70.0为微信的耗电

Estimated power use (mAh):
    Capacity: 3900, Computed drain: 439, actual drain: 117-156
    Uid u0a166: 70.0 ( cpu=1.66 wake=1.69 radio=66.1 sensor=0.540 )
    Idle: 45.5
    Uid u0a84: 43.4 ( cpu=0.732 wake=0.000292 radio=1.02 gps=0.304 sensor=41.3 )
    Uid u0a15: 42.5 ( cpu=0.118 wake=0.120 radio=42.2 )
    Uid 0: 42.2 ( cpu=8.27 wake=7.58 radio=26.4 )
    Uid 1000: 26.8 ( cpu=8.09 wake=1.24 radio=16.8 gps=0.534 sensor=0.118 )
    Uid u0a298: 10.9 ( cpu=3.11 wake=4.49 radio=2.74 sensor=0.560 )

具体统计:

u0a166:
  Mobile network: 181.22KB received, 79.26KB sent (packets 488 received, 617 sent)
  Mobile radio active: 22m 2s 198ms (29.1%) 76x @ 1197 mspp
  Wake lock *alarm*: 2s 75ms partial (48 times) realtime
  Wake lock WakerLock:overflow: 2m 51s 280ms partial (220 times) realtime
  TOTAL wake: 2m 53s 355ms partial realtime
  Sensor 17: 2h 20m 58s 990ms realtime (0 times)
  Background for: 7h 33m 26s 672ms 
  Total running: 7h 33m 26s 672ms 

一段提取耗电量的脚本:

pkgName = "com.xx.xx"
ps = subprocess.Popen("adb shell dumpsys batterystats", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

uid = ""
uid_tag = False
power_tag = False
uid_re = '=(.+?):"{}"'.format(pkgName)
while True:
    line = ps.stdout.readline()
    if line:
        if "Battery History" in line:
            uid_tag = True
        if "Estimated power use (mAh):" in line:
            power_tag = True
    else:
        break

    if uid_tag:
        temp = re.findall('=(.+?):"{}"'.format(pkgName), line)
        if len(temp) > 0:
            uid = temp[0]
            print uid
            uid_tag = False
    if power_tag:
        temp = re.findall("Uid {}: (.+?) ".format(uid), line)
        if len(temp) > 0:
            print temp[0]
            power_tag = False

battery-historian

更详细的图表需要battery-historian下的/script/historian.py生成图表。

python historian.py -a battery.txt > battery.html

这里生产的网页查看需要翻墙,因为请求了一些google的js和css,这里把需要的资料放网盘了。(这样本地化也方便集成到其他系统)

百度网盘

一共需要替换两个地方

  1. 资源中jsapi最后两行writeLoadTag方法中load资源的路径,改成自己的路径
oogle.loader.writeLoadTag("css", google.loader.ServiceBase + "/api/visualization/1.0/40ff64b1d9d6b3213524485974f36cc0/ui+zh_CN.css", false);
google.loader.writeLoadTag("script", google.loader.ServiceBase + "/api/visualization/1.0/40ff64b1d9d6b3213524485974f36cc0/dygraph,format+zh_CN,default+zh_CN,ui+zh_CN,timeline+zh_CN.I.js", false);
  1. battery-historian生成的html文件,需要导入所有的资源(两个css,两个js,一个jsapi)

比如:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
      <script type="text/javascript" src="https://www.google.com/jsapi?autoload={'modules':[{'name':'visualization','version':'1','packages':['timeline']}]}"></script>

替换成:

<link href="/static/dataProcess/js/battery/tooltip.css" rel="stylesheet" type="text/css">
      <script src="/static/dataProcess/js/battery/jquery.min.js"></script>
      <script type="text/javascript" src="/static/dataProcess/js/battery/jsapi"></script>
      <link href="/static/dataProcess/js/battery/ui+zh_CN.css" type="text/css" rel="stylesheet">
      <script src="/static/dataProcess/js/battery/dygraph,format+zh_CN,default+zh_CN,ui+zh_CN,timeline+zh_CN.I.js" type="text/javascript"></script>

一切都可以写成python脚本~美滋滋(historian.py中有很多可以拿来现成用的代码,建议可以看看)

目前刚开始做,准备集成到性能测试的自动化脚本中,求喷求建议

坑:
记录一个坑,在连接usb数据线的情况下,数据不会更新,数据不会更新,数据不会更新。必须拔掉数据线,才会开始记录。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 19 条回复
605

剪烛进平安了?

2562

哇噢,美滋滋

852

我这边也是这么处理的耗电量。dumpsys的数据感觉不reset就不更新了。

104 seveniruby 将本帖设为了精华贴 09月14日 17:52
104

我记得我被这个工具坑过一次 忘记是什么原因了 貌似还不是翻墙 查了半天才解决

609
104seveniruby 回复

找到一个坑,连接usb数据线时,数据不会更新,必须拔线才能测功耗。இAஇ

609
605chenhengjie123 回复

இAஇ 是的是的是的

609
852blink 回复

இAஇ感觉连着数据线就不更新

609
2562carl 回复

இAஇ 还需要一些工作

48bd40

这个必须马,回头试试

Ee76af

连着数据线出于充电状态 你可以通过命令关闭充电 只做连接再试试 不行的话就走wifi吧

4107

最近也在看这个,这个就是要断开USB连接,连接时,不会被认为在消耗设备的电量

6853

看google的文档也是要让断掉电源的

6853

组里游戏测电量的现在是用的电流仪测试iOS的电量。这种方法测试来的电量是否要比电流仪要好一些?实践中的效果如何?

Bbd245

实践个人觉得还是电流仪更加接近用户真实耗电情况,一般APP运行都会或多或少的使用wifi、数据业务喇叭传感器等等。单一抓某进程的耗电量 是否具有很好的参考性?

609
Ee76afkasi 回复

இAஇ 貌似并不行

609
6853codeskyblue 回复

இAஇ 这个只能测试Android。觉得看需求吧。这种方法可以获取单独app的消耗,排除其他系统应用和屏幕的影响,而且操作比较简单。如果需要测试整机,并且需求更精确,还是上仪器吧。

609
Bbd245ctro15547 回复

估算的电量已经包含了wifi,alarm,radio,这一些了。屏蔽的好像只有屏幕耗电。用仪器的话,确实更加接近用户的真实耗电,但是这个方法更加接近app的真实耗电。我觉得看测试的需求吧。

10174

不是可以用命令屏蔽USB充电嘛

4107
10174f_si 回复

这个屏蔽充电的咋玩

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册