APP——功耗测试(耗电测试)——adb命令复杂获取分析
Posted 小白龙白龙马
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了APP——功耗测试(耗电测试)——adb命令复杂获取分析相关的知识,希望对你有一定的参考价值。
查看手机电量信息:adb shell dumpsys battery
设置电池为充电状态——adb shell dumpsys battery set status 2
设置电池为非充电状态——adb shell dumpsys battery set status 1
设置电量百分比——adb shell dumpsys battery set level 100
复位,恢复实际状态——adb shell dumpsys battery reset
设置断开充电(android 6.0以上)——adb shell dumpsys battery unplug ——软件角度模拟断开充电(实际上是充进电)
==================================================================================================
==================================================================================================
获取整个设备的电量消耗信息: adb shell dumpsys batterystats | more
获取某个apk的电量消耗信息: adb shell dumpsys batterystats 包名 | more
C:\\Users\\del>adb shell dumpsys batterystats | more > C:\\Users\\del\\Desktop\\a.txt
C:\\Users\\del>adb shell dumpsys batterystats com.wawj.app.t | more > C:\\Users\\del\\Desktop\\a.txt
==================================================================================================
==================================================================================================
清除已有的耗电量数据—— adb shell dumpsys batterystats --enable full-wake-history
设备耗电量数据重置—— adb shell dumpsys batterystats --reset
==================================================================================================
==================================================================================================
电量分析工具Battery Historian的环境搭建与使用
Battery Historian 是一个这样的的工具:可以在 Android 5.0 Lollipop(API 级别21)及更高版本的 Android 设备上检测与电池相关的信息和事件,而在此期间,该设备没有插上电源。它允许应用程序开发人员在时间轴上可视化系统和应用级别的事件,并使用平移和缩放功能,在设备最后一次完全充电之后,可以轻松地查看各种聚合统计信息,可以选择一个应用程序,检查所选择的应用程序对电池指标的影响。此外,它还允许对两个错误报告进行 A/B 比较,突出显示了关键电池相关指标的差异。
环境配置
(1)安装Go编程语言
点击下载go语言。
配置GOROOT、GOPATH、PATH环境变量。
检查是否安装成功:cmd 执行 “go version”
(2)安装 Python
下载:https://www.python.org/ 【注意仅支持 python 2.7,python3.0改变很大】
安装
配置环境变量
检查是否安装成功:cmd 执行 “python –V”【注意是大写V】
(3)安装Git
安装
检查是否安装成功:cmd 执行 “git version”
(4)下载 Battery Historian 源码并且运行
- cmd 执行“go get -d -u github.com/google/battery-historian/...”【注意最后有三个点】
下载成功后会在GOPATH(我自己建的工作空间文件目录)下生成src文件夹
-
进入到$GOPATH/src/github.com/google/battery-historian目录下方
-
运行Battery Historian
cmd 执行“go run setup.go”【第一次执行要下载,时间会久一些,以后就快些】
ps:http://blog.csdn.net/feitian_666/article/details/52756522 提供了一个在没有下载成功情况下补充“go run setup.go”的方法:手动下载【closure-library】和【closure-compiler】和【flot-axislabels】,解压放到 GOROOT 目录下 third_party 文件夹下方的的 closure-compiler、closure-library 和flot-axislabels 文件夹,如果没有均手动创建。
cmd 执行 go run cmd/battery-historian/battery-historian.go
- 检查/battery-historian是否运行
登录网址 http://localhost:9999查看是否加载运行battery historian。
使用
(1).初始化
battery-historian工具需要使用bugreport中的Battery History,因此需要如下的操作。
重启adb服务:
adb kill-server
adb start-server
这一步很重要,因为当我们开发时做电量记录时会打开很多可能造成冲突的东西。为了保险起见我们重启adb。
通过以下命令来打开电池数据的获取以及重置:
adb shell dumpsys batterystats --enable full-wake-history
adb shell dumpsys batterystats --reset
上面的操作很重要,因为可以过滤掉不需要的数据。然后断开数据线(防止数据线造成充放电数据干扰),运行自己的APP进行测试。
(2)导出手机的 Bugreport 文件
重新连接USB调试,通过下面的命令获取数据:
adb bugreport bugreport.zip(6.0以及以下的,使用adb bugreport > bugreport.txt导出)
你在哪个目录下执行adb bugreport bugreport.zip 就会在哪个目录下生成 bugreport.zip文件
(3)上传bugreport.zip文件至 http://localhost:9999
最后
注意:7.0以下的,需要使用旧版本的adb工具,不然没法采集,参考文章http://blog.csdn.net/mwq30123/article/details/53888449
注意:官方SDK文档导出文件方式为:adb shell dumpsys batterystats > batterystats.txt。使用python historian.py batterystats.txt > batterystats.html查看数据。这是battery-historian老版本的使用方式. 目前Battery Historian已更新2.0版本, 推荐使用bugreport方式导出数据分析, 可以看到更多信息。
注意:模拟器可能获取不到有用的电量数据,网页没有显示电量信息,如下图所示:
android电量统计的原理可以参看这篇文章:http://duanqz.github.io/2015-07-21-batterystats-part1
大致原理摘录如下:
一、电量记录
1. Android在进行电量统计时,并不是采用直接记录电流消耗量的方式,而是跟踪硬件模块在不同状态下的使用时间,收集一些可用信息,用来近似的计算出电池消耗量。
举一个例子,假定某个APK的使用了GPS,使用时间用 t 表示。GPS模块单位时间的耗电量用 w 表示,那么,这个APK使用GPS的耗电量就可以按照如下方式计算:
耗电量 = 单位时间耗电量(w) × 使用时间(t)
frameworks.jar里的frameworks/base/core/res/res/xml/power_profile.xml这个文件,记录着各个模块单位时间的耗电量, 由厂商定义。
以下是Nexus 5(hammerhead)耗电参数配置的代码片段:
<device name="Android">
<!-- All values are in mAh except as noted -->
<item name="none">0</item>
...
<item name="wifi.on">3.5</item>
<item name="wifi.active">73.24</item>
<item name="wifi.scan">75.48</item>
...
<item name="battery.capacity">2300</item>
</device>
2. Android框架层通过一个名为batterystats的系统服务,实现了电量统计的功能。
收集信息被组织起来,在内存中的数据结构是由BatteryStats类描述的。 为了能够从不同维度统计耗电量,这个数据结构设计得比较复杂,我们不在这里展开讨论,仅通过一个收集应用程序前台运行时间的例子,来说明信息收集过程。
记录应用程序中所有Activity从显示状态(Resumed)到消失状态(Paused)的时间,就能够统计应用程序的前台运行时间。Activity状态的切换是由AMS掌控的,因此AMS需要将Activity的状态信息通知给batterystats服务。
当Activity要切换到显示状态(Resumed)时,
会调用ActivityStackSupervisor.resumeTopActivitiesLocked()方法,
接下来会调用ActivityStack.resumeTopActivityInnerLocked()方法来完成Activity的状态切换,在完成状态切换后, 会调用
ActivityStackSupervisor.reportResumedActivityLocked()方法,从这里开始,就开始通报了:“本Activity已经进入了显示状态”。
在ActivityStackSupervisor.reportResumedActivityLocked()中得到BatteryStatsImpl对象,
并启动一个计时器(StopwatchTimer),
记录下了启动时间.在Activity pause时, 再得到结束时间, 这样就得到了应用程序的acitiviy在前台的运行时间了。
除了应用程序前台运行时间,还有很多信息是batterystats服务关注的,包括WakeLock、Sendor、Wifi、Audio、Video等,这些信息的采集方式与上述过程雷同,都会经过以下步骤:
由相应的模块发起状态变更的通知
BatteryStats使用定时器记录起止时间
二、电量信息的储存
Android支持历史电量信息的显示的,如果重新启动Android,那内存中的数据就丢失了, 所以需要把这些信息存储到磁盘上,磁盘上的 /data/system/batterystats.bin 文件中就是电量信息的序列化数据。
batterystats服务启动时,会从 batterystats.bin 这个文件中读取数据,来初始化BatteryStats这个数据结构。
三、电量计算
BatteryStatsHelper.refreshStats()承载了电量计算的全部过程,在需要显示电量统计信息的地方,就可以通过BatteryStatsHelper这个类,来获取统计完成的电量信息。 Setting.apk就引用了这个类。电量计算大体可以分为两块:
1. AppUsage:应用程序耗电量计算,是指每一个应用程序使用硬件模块所产生的耗电量
在BatteryStatsHelper.processAppUsage()这个方法中,实现了应用程序的电量计算(实际上统计的粒度是uid,不同的apk可以运行在同一个uid)。
2. MiscUsage:其他杂项耗电量计算
所谓杂项,其实就是用户比较关心的一大类,包括:待机的耗电量、亮屏的耗电量、通话的耗电量、Wifi的耗电量等,这个统计是系统层面的, 作为app的开发人员可以忽略掉这部分内容。
我们来总结一下应用程序的电量计算过程。Android通过一个名为BatteryStats.Uid的数据结构来维护一个应用程序的电量统计信息。 这个数据结构中,又包含很多子结构:
Proc:表示属于Uid的进程,一个Uid中可能会有多个进程,每个进程都有CPU占用时间
WakeLock:表示Uid持有的WakeLock锁的电量统计,一个Uid也可能会持有多个锁
Mobile Radio:表示Uid使用数据流量的电量统计,譬如3G流量、4G流量
Wifi:表示Uid使用wifi的电量统计
Sendor:表示Uid使用传感器的电量统计
Android提供的dumpsys命令用于查看系统服务的信息, 将batterystats作为参数,就能输出完整的电量统计信息。
adb shell dumpsys batterystats
参考链接:https://www.jianshu.com/p/1cf7c690a4d2
================================================================================================
准备条件
充电100%后再多充30分钟后开始测试
关掉其他app排除影响
相同屏幕亮度,最大最好
设置屏幕不自动关闭
使用charles 3G网络限速
每次留bugreport
每次都要重新安装app(或者清楚数据),保证耗电量从0开始计算
无线adb技术
安装adb【各种baidu就行】
确保手机跟电脑都处于同一个网络
手机插线连着电脑,确保已连接上,使用【adb devices】命令check,是否连接
输入【adb tcpip 5555】,使用tcpip协议连接手机
1.无线连接手机
adb connect 192.168.1.8
2.清除已有的耗电量数据
adb shell dumpsys batterystats --enable full-wake-history
3.设备耗电量数据重置
adb shell dumpsys batterystats --reset
4.寻找包名的uid
adb shell ps |find "com.nuomi"
以下是dos下出来的信息,u0_a445就是uid,需要去除下划线_, 即u0a445
u0_a445 7068 772 1646920 85320 SyS_epoll_ 0000000000 S com.nuomi:installdex
u0_a445 7158 772 1854944 226048 SyS_epoll_ 0000000000 S com.nuomi
u0_a445 7190 772 1663432 89120 SyS_epoll_ 0000000000 S com.nuomi:ultranet
u0_a445 7208 772 1641072 85336 SyS_epoll_ 0000000000 S com.nuomi:remote
5.确定测试包的名字和uid
adb shell dumpsys batterystats "com.nuomi" |find "u0a445"
6.然后执行业务场景,结束之后杀进程
7.杀完进程后,把耗电量信息传到电脑该目录下
adb bugreport>test.txt
8.等待传送结束,手机会震动以下,表示数据传输到电脑完毕
9.打开记录的txt文件,查找耗电量信息,如下图,1.98mah(毫安时)就是该业务场景的耗电量
以上是关于APP——功耗测试(耗电测试)——adb命令复杂获取分析的主要内容,如果未能解决你的问题,请参考以下文章