Android 从两个层面统计电量的消耗,分别为软件排行榜及硬件排行榜。它们各有自己的耗电榜单,软件排行榜为机器中每个 App 的耗电榜单,硬件排行榜则为各个硬件的耗电榜单。这两个排行榜的统计是互为独立,互不干扰的
一、电量统计模块概述
耗电信息在设置 -> 电量中能够非常直观的看到。注意,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
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图表的一个例子:
2.4、bugreport 文件分析
前面是通过Battery History 对bugreport 的文件进行了分析,那如果我们想自己分析呢?因此,在这里有必要了解下bugreport 的文件内容。
电量统计信息起始,包含 reset 时间,进程信息等
可以通过关键字下面的关键字来寻找相关信息。
DUMP OF SERVICE
通过该关键字可以查到 wifi, 网络, activities 等等的信息。
以上就是如何通过Battery Historian分析Android APP耗电情况的详细内容,更多关于Battery Historian Android APP耗电情况的资料请关注编程学习网其它相关文章!
本文标题为:如何通过Battery Historian分析Android APP耗电情况
- Android实现监听音量的变化 2023-03-30
- Flutter实现底部和顶部导航栏 2022-08-31
- SurfaceView播放视频发送弹幕并实现滚动歌词 2023-01-02
- Android实现轮询的三种方式 2023-02-17
- Android studio实现动态背景页面 2023-05-23
- 详解flutter engine 那些没被释放的东西 2022-12-04
- 作为iOS开发,这道面试题你能答出来,说明你基础很OK! 2023-09-14
- iOS 对当前webView进行截屏的方法 2023-03-01
- 最好用的ios数据恢复软件:PhoneRescue for Mac 2023-09-14
- Android MaterialButton使用实例详解(告别shape、selector) 2023-06-16
