android开发分享如何通过Battery Historian分析Android APP耗电情况

一、电量统计模块概述耗电信息在设置 -> 电量中能够非常直观的看到。注意,android 所有功耗统计都是通过代码估算,没有集成电路参与汇报。准确度取决于厂商 rom 所提供的power_pro


一、电量统计模块概述

耗电信息在设置 -> 电量中能够非常直观的看到。注意,android 所有功耗统计都是通过代码估算,没有集成电路参与汇报。准确度取决于厂商 rom 所提供的power_profile.xml文件。由于不同厂商power_profile.xml准确度及源码有差异,因此不同手机、不同版本的数据可能有较大差异。

power_profile.xml直接影响统计的准确度,并且此文件无法通过应用修改。再次强调,android 耗电估算没有硬件的参与,全靠代码估算。

power_profile.xml文件位于源码下的/framework/base/core/res/res/xml/power_profile.xml,部分内容展示如下:

  <item name="radio.scanning">0.1</item> <!-- cellular radio scanning for signal, ~10ma -->    <item name="gps.on">0.1</item> <!-- ~50ma -->    <!-- current consumed by the radio at different signal strengths, when paging -->    <array name="radio.on"> <!-- strength 0 to bins-1 -->        <value>0.2</value> <!-- ~2ma -->        <value>0.1</value> <!-- ~1ma -->    </array>    </array>    <!-- different cpu speeds as reported in         /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state -->    <array name="cpu.speeds">        <value>400000</value> <!-- 400 mhz cpu speed -->    </array>    <!-- current when cpu is idle -->    <item name="cpu.idle">0.1</item>    <!-- current at each cpu speed, as per 'cpu.speeds' -->    <array name="cpu.active">        <value>0.1</value>  <!-- ~100ma -->    </array>    <array name="wifi.batchedscan"> <!-- ma -->        <value>.0002</value> <!-- 1-8/hr -->        <value>.002</value>  <!-- 9-64/hr -->        <value>.02</value>   <!-- 65-512/hr -->        <value>.2</value>    <!-- 513-4,096/hr -->        <value>2</value>    <!-- 4097-/hr -->    </array>

这就是在硬件层面统计时,直接参与运算的参数。无论是软件耗电统计还是硬件耗电统计,都通过batterystatshelper来进行汇总。batterystatshelper位于/framework/base/core/java/com/andorid/internal/os/batterystatshelper.java下。

1.1、软件耗电统计

batterystatshelper.java中,有这么一个方法:

  private void processappusage(sparsearray<userhandle> asusers) {      final boolean forallusers = (asusers.get(userhandle.user_all) != null);      mstatsperiod = mtypebatteryrealtime;        batterysipper ossipper = null;      final sparsearray<? extends uid> uidstats = mstats.getuidstats();      final int nu = uidstats.size();      for (int iu = 0; iu < nu; iu++) {          final uid u = uidstats.valueat(iu);          final batterysipper app = new batterysipper(batterysipper.draintype.app, u, 0);            mcpupowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);          mwakelockpowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);          mmobileradiopowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);          mwifipowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);          mbluetoothpowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);          msensorpowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);          mcamerapowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);          mflashlightpowercalculator.calculateapp(app, u, mrawrealtime, mrawuptime, mstatstype);            final double totalpower = app.sumpower();          if (debug && totalpower != 0) {              log.d(tag, string.format("uid %d: total power=%s", u.getuid(),                      makemah(totalpower)));          }      }      ... // code  }

processappusage()方法中,一个应用的总功耗在这里体现出来了:

  • cpu
  • wakelock(保持唤醒锁)
  • 无线电(2g/3g/4g)
  • wifi
  • 蓝牙
  • 传感器
  • 相机
  • 闪光灯

这些数据,将决定着你的应用在耗电排行榜中的位置,以及是否给予用户警告高耗电。这些警告对于应用来说可能是致命的,用户可能因此而卸载应用。

应用总功耗是上述八个统计值的和。这八个统计器同继承自powercalculator.java

具体来说,这八个耗电计算器的算法分别如下:

如何通过Battery Historian分析Android APP耗电情况

耗电统计概述就如上所述。总的来说并不复杂,通过聚合八种不同方式的消耗,来得出总的耗电量,并给予用户展示。

二、battery-historian

2.1、概述

battery historian ,是谷歌出品的耗电分析器。通过 battery historian,可将导出的 bugreport 文件可视化。在第一代的 battery historian 中,google 使用了 python 作为数据解析工具。拿到 bugreport 文件后,通过终端执行 python 来生成可视化的 html 文件。这种方法使用起来较为麻烦,而且无法部署到服务器。因此在第二代 battery historian,google 选择了使用 docker 容器。现在完全不推荐使用第一代 battery historian,已经许久没有维护了,而且功能过于简陋。

需要注意的是 battery-historian 在使用时候不能在充电,同时确保设备运行的 android 版本是 5.0 及以上。

通过上面的描述,对battery-historian 的功能有个大概的了解,下面进入到实战。

2.2、获取bugreports

battery-historian 虽然功能强大,但是也是需要先提供数据的,其数据的获取需要我们手动操作。下面介绍如何获取bugreports。

1.电脑连接上手机,断开adb服务,adb作为一种连接的方式,有可能被其他的程序占用,所以我们做电量记录时要避免打开很多可能冲突的东西

adb kill-server

2. 重启adb服务

adb devices || adb start-server

3. android也不记录特定于应用程序的用户空间wakelock转换的时间戳。如果您希望historian在时间线上显示关于每个单独唤醒锁的详细信息,则应在开始实验之前使用以下命令启用完整唤醒锁报告:

adb shell dumpsys batterystats –enable full-wake-history

4. 采集报告前将battery统计状态重置,重置命令结束后断开usb,测试结束后用获取报告命令导出统计文件包

adb shell dumpsys batterystats –reset

5. 导出电量,对于 7.0 系统以上的设备运用:

adb bugreport bugreport.zip

adb bugreport > $home/documents/bugreport.zip // 指定到对应目录下,具体分机型,可能会有些不一样

6.0 或更低版本:

adb bugreport > bugreport.txt

2.3、数据分析

获取到数据后,接下去就是对数据进行分析了。

如图所示battery historian图表的一个例子:

如何通过Battery Historian分析Android APP耗电情况

其中标号的意义是:

  • 标号1:从下拉列表中添加其他指标;
  • 标号2:将鼠标悬停在信息图标上可以查看有关每个指标的详细信息,包括图表中使用的不同颜色代表意义的介绍;
  • 标号3:将鼠标悬停在某个条目上可以查看该指标的更多详细信息,以及时间线上特定点的耗电量信息;

这是整个手机状态图,包括手机电量,cpu 使用时长,wifi 信号的强度,手机温度变化等等,都在上面详细的用图表展示出来了。

battery historian除了能够提供宏观的系统层面的信息,还能够提供针对指定app的可视化数据和表格信息,这表格主要信息包括:

  • device estimated power use等基本信息
  • networks information:app网络信息
  • wakelocks:唤醒锁信息,一般和业务强相关
  • services:服务信息,查看app开启的services信息
  • process info:进程信息

battery historian图表下为数据分析,包括三个tab,如下图所示,可以查看app更多信息:

如何通过Battery Historian分析Android APP耗电情况

其中,标号所代表的意义是:

  • 标号1:system stats 分组包含系统级别的数据,比如屏幕亮度等。这一栏显示了系统发生的总体情况,可以用来测试是否存在外部影响事件;
  • 标号2:app stats分组包含针对指定app的详细信息;
  • 标号3:可以根据不同的分类标准对app进行排序;
  • 标号4:在下拉列表中选择指定的app后可在app stats中查看具体信息,app stats所展示的都是所选定app产生的数据,不会受到外部因素的影响;

下面看看具体某个手机的数据,比如百度app应用的数据,在右边选择对应的 app,左边就会展示当前 app 的电量,网络等情况。

如何通过Battery Historian分析Android APP耗电情况

2.4、bugreport 文件分析

前面是通过battery history 对bugreport 的文件进行了分析,那如果我们想自己分析呢?因此,在这里有必要了解下bugreport 的文件内容。

电量统计信息起始,包含 reset 时间,进程信息等

如何通过Battery Historian分析Android APP耗电情况

下面是距离上次充电后的数据统计:

如何通过Battery Historian分析Android APP耗电情况

每个 app 电量使用情况,通过 uid 来标识app

如何通过Battery Historian分析Android APP耗电情况

可以通过关键字下面的关键字来寻找相关信息。

dump of service 

通过该关键字可以查到 wifi, 网络, activities 等等的信息。

以上就是如何通过battery historian分析android app耗电情况的详细内容,更多关于battery historian android app耗电情况的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/addevelopment/889127.html

(0)
上一篇 2021年10月19日
下一篇 2021年10月19日

精彩推荐