Android耗电分析(Battery Historian工具使用)

        Battery-Historian是谷歌推出的一款专门分析Bugreport的工具,是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具,是一款对于分析手机状态,历史运行情况很好的可视化分析工具。

        当设备在使用电池的时候,它可以使开发者们看到系统级和应用级事件图表,在图表时间轴上可以缩放和平移,能够直观的看到自上一次充满电到现在设备电池的统计汇总信息,它可以选中一个应用程序来检查该应用影响电池电量的一些参数,并且可以对比两个bugreport文件信息分析,并对其电池关键区别点做高亮显示。

        不过,需要注意的是,battery historian在使用时候不能在充电,同时确保设备运行在Android 5.0及以上版本。而对于Android8.0及其以上版本,我们更推荐使用Android Studio自带的Energy Profiler工具。

安装Battery Historian

安装Docker(Windows)

安装环境

环境要求
  1. Windows启动WSL2功能
  2. CPU支持二级地址转换(SLAT)
  3. 4G以上内存
  4. BIOS设置中启用硬件虚拟化支持

安装Docker

下载地址:Overview of Docker Desktop | Docker Docs

检测Docker安装

  1. 打开Windows PowerShell

  2. 执行以下命令从官方仓库中拉取hello-world的镜像到本地,并且自动将其实例化成容器。

docker run hello-world

输出如下:

PS C:\Users\xxx> docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:ac69084025c660510933cca701f615283cdbb3aa0963188770b54c31c8962493
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

安装Battery Historian镜像

1.先启动 Docker Desktop 应用(即 Docker 的 GUI 前端),然后再运行 Battery Historian 映像。运行此映像会初始化 Docker 工具。此操作至少要执行一次,Battery Historian 才会运行。

2.首次运行 Battery Historian 时,请从命令行运行此工具。您无法通过 Docker Desktop 应用指定用于运行 Web 服务器的端口,只能从命令行执行此操作。不过,当您从命令行成功运行容器后,系统会在 Docker Desktop 中创建一个条目,然后您可以使用 Docker Desktop 中的同一监听器端口启动该条目。

3.使用以下命令运行Battery Historian映像:

docker run -p port_number:9999 gcr.io/android-battery-historian/stable:3.1 --port 9999

4.Battery Historian 会使用您选择的端口,如使用 port_number 指定的端口。例如:

docker run -p 9999:9999 gcr.io/android-battery-historian/stable:3.1 --port 9999

5.在浏览器中打开Battery Historian

http://10.192.182.180:9999

其中10.192.182.180为本机IP地址

Battery Historian环境

        本地安装Battery Historian环境比较繁琐,所以我还是比较喜欢用别人搭建好的的地址:Battery Historian。(很香)

使用Batterystats收集数据

        耗电统计是系统组件,伴随系统运行的整个过程,也就是说只要系统在运行它就会一直统计耗电数据。这个统计是基于软件层面实现的,不同的硬件模块配置了不同的参数,然后使用算法进行估算,power_profile文件的参数值OEM厂商必须测量并提供前实际值,所以不同的厂商是不一样的。

        另外,获取统计报告的时候需要将重置统计,并断开usb连接,并且不能处于充电状态,否则会大大影响统计的结果。下面是使用步骤:

1.将移动设备并打开"开发者模式"并连接到计算机。(一般通过USB连接)

2.在终端窗口中,关闭正在运行的adb服务器

adb kill-server

3.重启adb

adb start-server

4.使用命令查看已连接的设备

adb devices

5.开启获取电量数据

adb shell dumpsys batterystats --enable full-wake-history

6.重置batterystats数据,设备始终会在后台收集 Batterystats 和其他调试信息。重置操作会清除之前收集的电池数据。如果您不重置,输出内容会非常大。

adb shell dumpsys batterystats --reset

7.断开设备与计算机的连接,以便仅通过设备电池供电

8.使用应用,然后执行要收集数据的操作

9.重新连接手机,确保手机连接上

10.生成数据报告log

adb bugreport [path/]bugreport.zip  //对于搭建 Android 7.0 及更高版本的设备
adb bugreport [path/]bugreport.txt  //对于搭建 Android 6.0 及更低版本的设备
adb bugreport > bugreport.txt       //对于搭建 Android 5.0 及更高版本的设备

 11.导出数据

C:\Users\xxx>adb bugreport bugreport.zip
/data/user_de/0/com.android.shell/files/bugreports/bugreport-ALN-AL00-HUAWEIALN-AL00-2024-01-02-15-25-21.zip: 1 file pulled, 0 skipped. 34.5 MB/s (5875956 bytes in 0.162s)
Bug report copied to bugreport.zip
adb pull /data/user_de/0/com.android.shell/files/bugreports/bugreport-ALN-AL00-HUAWEIALN-AL00-2024-01-02-15-25-21.zip D:\temp

12.运行docker,运行Battery Historian浏览器中打开,例如:http://10.192.182.180:9999点击Browse,选择zip包,执行Submit,等待解析完成(如果使用Battery Historian就不需要这一步操作了)。

获取包名

adb shell
dumpsys activity|grep  mFocusedWindow

Battery Historian指标分析

        打开Battery Historian网站,上传下载的bugreport进行分析。点击Browse,选择文件,然后再点击Submit,等待分析完成之后,会生成图表(刚刷机,还重置了数据,所以时间较短)。

 

        图表按类别进行组织,随着时间的推移显示每个类别的栏,如图表的X轴上所示。不同颜色代表指标的不同状态:比如Screen 红色代表亮屏,白色代表关屏,具体鼠标放在最左侧的️上就会自动提示。

        默认情况下,统计信息是在运行基础上维护的,Android也不记录特定于应用程序的用户空间wakelock转换的时间戳。如果您希望Historian在时间线上显示关于每个单独唤醒锁的详细信息,则应在开始实验之前使用以下命令启用完整唤醒锁报告。

adb shell dumpsys batterystats --enable full-wake-history

然后,我们来看一下具体的指标,分析前我们需要选择某个具体的应用:

页面的右下角有几个选项卡,可以用来查看一些具体的性能数据:

  1. System Stats:包含系统范围的统计信息,如单元信号级别和屏幕亮度。这些信息提供了设备发生情况的整体情况。这对确保没有外部事件影响特别有用。

  2. App Stats :包含有关特定应用程序的信息。使用左侧的应用程序选择窗格中排序应用程序下拉列表对应用程序列表进行排序。可以选择一个特定的应用程序来查看应用程序下拉列表的统计信息。

同时,在选择应用程序后,我们还可以选择某个具体的场景进行分析,如下图。

案例分析

使用battery historian进行电量分析时,通常有如下一些套路:

  1. 通过system stats 中screenon/off rate 平均亮灭屏耗电熟读可以初步确认亮屏或者灭屏耗电是否有异常。

  2. 通过选取电量值观察每格电量的消耗速度,确认耗电异常时间段和当前前台应用,网络状态,后台job等信息。

  3. 综合当前亮度,网络状态,后台job ,前台应用估算是否符合预期,确认是否当前配置环境问题,还是应用耗电异常。

下面看几个具体的案例场景:

  • 充电慢问题:查看充电电流值,确认充电电流是否符合预期。查看充电过程是否有异常job在长时间执行,如果有异常job耗电也会降低充电电流。查看对应电池温度是否有高温现象,电池温度过高会限制充电电流。

  • 发热问题:通过batterystats查看当前发热情况,找到温度最高区间,综合当前网络,亮度,应用确认耗电情况是否符合预期。如耗电电流不大,但是温度确持续增加,大概率环境无法散热导致,比如太阳光直射,物品覆盖无法散热。

  • 亮屏耗电问题:当出现亮屏耗电时,先检查网络状态,亮度状态,是否高耗电应用。不同网络耗电排行5G>4G>wifi,高亮下耗电会急剧增加,游戏相机场景会耗电大。

比如,下面的场景是用户反馈白天耗电快场景(4G下,高亮,加上后台GPS长时间定位)。

  • 息频耗电问题:息屏场景,部分app会通过音频持锁来给自己保活。通过查看audio和wakelock状态可以确认此类问题。app频繁网络包唤醒系统(应用唤醒频次低于1min),同样也会引起耗电快。

比如,下面的场景用户反馈息屏耗电快场景:从batteryhistorian可以看到xfPlay,一直持有音频锁给自己保活,导致系统无法休眠从而息屏耗电。

  • 息屏异常耗电问题:所有信息都符合预期,但是还是耗电快,此种情况可能是有异常器件漏电问题。

比如,下面的场景息屏耗电场景,唤醒周期超过2min,休眠比良好,但是耗电依旧很大。有可能是器件漏电,需要专业功耗工程师进一步分析。

  • 电量追赶问题:当发现耗电电流超过理论值,并且无异常发热,大概率是出现了电量追赶问题。当计算出来的真实电量和实际电量有差异时,实际电量就会快速下降追赶至真实电量,表现就是30s或者60s一格电的速度去追赶。

比如,息屏耗电场景平均耗电电流5466ma,理论手机不会出现这么大电流(。此时温度正常,大概率是出现了虚电,电量追赶问题,需要从kernel 日志进一步分析确认。

Battery Historian图形化工具,可以非常直观查看历史耗电信息,追溯到耗电场景。对于一般用户,Battery Historian分析简单耗电问题已经足够。不过,对于更深的耗电问题,则需要更多的辅助日志或者dump 由更专业工程师进一步分析。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值