APP——功耗测试(耗电测试)——adb命令复杂获取分析

时间:2024-02-15 14:13:51

查看手机电量信息: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环境变量。

 
GOROOT
 
GOPATH
 
Path

检查是否安装成功:cmd 执行 “go version”

 
 
(2)安装 Python

下载:https://www.python.org/ 【注意仅支持 python 2.7,python3.0改变很大】

安装

配置环境变量

 
Paste_Image.png

检查是否安装成功:cmd 执行 “python –V”【注意是大写V】

 
 
(3)安装Git

下载:https://git-scm.com/

安装

检查是否安装成功:cmd 执行 “git version”

 
 
(4)下载 Battery Historian 源码并且运行
  1. cmd 执行“go get -d -u github.com/google/battery-historian/...”【注意最后有三个点】
 
 

下载成功后会在GOPATH(我自己建的工作空间文件目录)下生成src文件夹


 
 
  1. 进入到$GOPATH/src/github.com/google/battery-historian目录下方


     
     
  2. 运行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
 
 
  1. 检查/battery-historian是否运行
    登录网址 http://localhost:9999查看是否加载运行battery historian。
     
    G@~)M7WYR)R@T_(V9P%@5JV.png

使用

(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方式导出数据分析, 可以看到更多信息。
注意:模拟器可能获取不到有用的电量数据,网页没有显示电量信息,如下图所示:

 
模拟器的bugreport
 
真实手机的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(毫安时)就是该业务场景的耗电量