• 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:Usersdel>adb shell dumpsys batterystats | more > C:UsersdelDesktopa.txt

    C:Usersdel>adb shell dumpsys batterystats com.wawj.app.t | more > C:UsersdelDesktopa.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(毫安时)就是该业务场景的耗电量

  • 相关阅读:
    Linux-read 命令(20)
    47.Linux-DEVICE_ATTR()介绍及使用示例
    46.Linux-创建rc红外遥控平台设备,实现重复功能(2)
    46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)
    Xcode定位光标到行首行尾
    Mac 教程:OS X「剪切」移动文件的三种方法
    iOS Xcode最新真机调试包 DeviceSupport
    Flex布局做出自适应页面--语法和案例
    如何使用Android Studio与夜神模拟器开发调试
    Android源代码下载与编译
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/13284028.html
Copyright © 2020-2023  润新知