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环境

battery historian分析需要安装Docker,其安装和运行方法官方有详细的说明:Battery Historian安装。可能在本地安装Battery Historian环境还比较繁琐,此次推荐一个别人搭建好的地址:https://bathist.ef.lc/。

image.png

二、生成耗电报告

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

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

  1. 连接手机,打开开发者模式,然后连接adb。
  2. 重置batterystats 数据, 手机始终在后台收集batterystats和其他调试信息,重置的命令:
adb shell dumpsys batterystats –reset
  1. 持续使用我们需要测试的应用,然后导出原始bugreport数据,导出的命令:
//Android 7.0及以上版本
adb bugreport bugreport.zip//Android 5.0及以上版本
adb bugreport > bugreport.txt

等待报告生成,会生成一个bugreport.zip或bugreport.txt文件,如下图。

image.png

三、Battery Historian 指标分析

打开https://bathist.ef.lc/网站,选择bugreport.zip文件并上传。
 

image.png


等待分析结果,分析完成之后,系统会生成如下的图表。
 

image.png


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

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

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

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

image.png


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

  • System Stats:包含系统范围的统计信息,如单元信号级别和屏幕亮度。这些信息提供了设备发生情况的整体情况。这对确保没有外部事件影响特别有用。
  • App Stats :包含有关特定应用程序的信息。使用左侧的应用程序选择窗格中排序应用程序下拉列表对应用程序列表进行排序。可以选择一个特定的应用程序来查看应用程序下拉列表的统计信息。

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

image.png

四、案例分析

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

  1. 通过system stats 中screenon/off rate 平均亮灭屏耗电熟读可以初步确认亮屏或者灭屏耗电是否有异常。
  2. 通过选取电量值观察每格电量的消耗速度,确认耗电异常时间段和当前前台应用,网络状态,后台job等信息。
  3. 综合当前亮度,网络状态,后台job ,前台应用估算是否符合预期,确认是否当前配置环境问题,还是应用耗电异常。 

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

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

image.png

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

image.png

3,亮屏耗电问题:当出现亮屏耗电时,先检查网络状态,亮度状态,是否高耗电应用。不同网络耗电排行5G>4G>wifi,高亮下耗电会急剧增加,游戏相机场景会耗电大。
比如,下面的场景是用户反馈白天耗电快场景(4G下,高亮,加上后台GPS长时间定位)。

image.png

4,息频耗电问题:息屏场景,部分app会通过音频持锁来给自己保活。通过查看audio和wakelock状态可以确认此类问题。app频繁网络包唤醒系统(应用唤醒频次低于1min),同样也会引起耗电快。
比如,下面的场景用户反馈息屏耗电快场景:从batteryhistorian可以看到xfPlay,一直持有音频锁给自己保活,导致系统无法休眠从而息屏耗电。

image.png

5,息屏异常耗电问题:所有信息都符合预期,但是还是耗电快,此种情况可能是有异常器件漏电问题。
比如,下面的场景息屏耗电场景,唤醒周期超过2min,休眠比良好,但是耗电依旧很大。有可能是器件漏电,需要专业功耗工程师进一步分析。

image.png

  1. 电量追赶问题:当发现耗电电流超过理论值,并且无异常发热,大概率是出现了电量追赶问题。当计算出来的真实电量和实际电量有差异时,实际电量就会快速下降追赶至真实电量,表现就是30s或者60s一格电的速度去追赶。
    比如,息屏耗电场景平均耗电电流5466ma,理论手机不会出现这么大电流(。此时温度正常,大概率是出现了虚电,电量追赶问题,需要从kernel 日志进一步分析确认。

    image.png

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

原文地址:滑动验证页面icon-default.png?t=N7T8https://segmentfault.com/a/1190000043378961

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络原理】初识网络原理

目录 🎄网络发展史🌸独立模式🌸网络互连🌻局域网LAN🌼基于网线直连🌼基于集线器组建🌼基于交换机组建🌼基于交换机和路由器组建 🌻广域网WAN 🌳网络通信基础&…

学习网络安全越早知道越好的事

网络安全专业最应该知道的血泪建议,希望大一就有人告诉你。 如果你是网络安全行业,那么大学四年千万不能就在宿舍打游戏度过, 大一你应该学习掌握基础的编程语言,比如Python,PHP,web前端,知道…

【STM32+OPENMV】矩形识别

一、准备工作 有关OPENMV最大色块追踪及与STM32通信内容,详情见【STM32HAL】与OpenMV通信 二、所用工具 1、芯片:STM32F103C8T6 2、CUBEMX配置软件 3、KEIL5 4、OPENMV 三、实现功能 寻找黑色矩形,并将最大矩形的四个边缘坐标发送给STM…

24V降压3.3V异步降压型DC-DC恒压芯片 H4110惠海半导体

H4110是一种内置30V耐压MOS,并且能够实现精确恒压以及恒流的异步降压型 DC-DC转换器; 支持 1A 持续输出电流,输出电压可调,最大可支持 100%占空比;通过调节 FB端口的分压电阻,可以输出 2.5V到 22V 的稳定电压 。H4110 …

揭秘Vue中v-model的内部工作机制

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

使用Weaviate向量数据库:从Embeddings到Applications (Multilingual Search和RAG)

Vector Databases: from Embeddings to Applications 课程地址:https://www.deeplearning.ai/short-courses/vector-databases-embeddings-applications/ 下面是这门课程的笔记。 使用Weaviate向量数据库:从Embeddings到应用,比如Multilin…

Material Studio 中 DMol3 计算材料吸附能

1.先导入Cif文件 2.切表面 3.沿着你要切的晶面切 4.扩胞 5.加真空层(一般加10埃) 现在就是这样的了 6.然后对其结构优化(高斯几何优化) 7.再在体系上加原子或者想要的材料 8.Outmal文件中最后的Ef就是整个体系的能量&#xff0…

代码随想录算法训练营第24天|77. 组合

77.组合 思路:如果暴力解,需要几个数则需要相应的for循环个数。 回溯法:把数的组合抽象成一颗树,利用递归的思想进行回溯,递归必有回溯。每次遍历到叶子节点,则存入结果。 代码&#xff1a; vector<vector<int>> result;//存放结果vector<int> path;//存放…

猜数字游戏(C语言)

一&#xff1a;游戏要求 1.电脑自动生成1~100随机数字 2.玩家猜数字&#xff0c;在猜数字过程中&#xff0c;根据猜数字的大小&#xff0c;根据猜数据的大小&#xff0c;给出大了还是小了的反馈&#xff0c;直到猜对游戏 二&#xff1a;随机数的生成 要完成猜数字游戏&…

Chroma向量数据库使用案例

​​​​​基于ChromaDB与BGEToward-VectorModel的本地私有化向量检索之路 安装基础环境 包括Python安装、pip安装及镜像设置等网上提供很多资料,这里就不介绍了。 安装chromaDB环境安装pip install chromadb 安装pdf解析库pip install pdfminer.six 安装模型库pip install …

vue3项目打包上线后,如何配置api接口地址,省去更换api再次打包

vue3项目打包上线后,如何配置api接口地址,省去更换api再次打包 一、项目根目录下public文件夹创建static>config.js文件 window.webConfig {//动态配置api(用于上线后更改api)webApiBaseUrl: xxx,//基础接口地址 }二、项目根目录下public文件夹index.html页面 <script s…

代码随想录算法训练营第33天—动态规划01 | ● 理论基础 ● 509. 斐波那契数 ● *70. 爬楼梯 ● *746. 使用最小花费爬楼梯

动态规划理论基础 https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 视频&#xff1a;https://www.bilibili.com/video/BV13Q4y197Wg 主要题型 动规基础题 斐波那契数列&#xff08;爬楼梯&#xff09; 背包问题打…

Java中super关键字作用及解析

在 Java 中&#xff0c;super关键字主要有以下作用&#xff1a; 在子类构造方法中调用父类的构造方法&#xff1a;使用super关键字可以在子类的构造方法中显式调用父类的构造方法&#xff0c;以便继承父类的属性和行为。语法如下&#xff1a;这样可以确保父类的构造方法被正确…

回收站选址(CCF 201912-2)解题思路

分析 把x,y坐标拼接成一个字符串&#xff08;x,y&#xff09;作为Set的key&#xff0c;保存到Set中&#xff0c;遍历Set&#xff0c;取出坐标&#xff0c;然后判断上下左右四个点是否在Set中&#xff0c;如果在&#xff0c;进而判断&#xff0c;四个角是否在Set中&#xff0c;…

【操作系统学习笔记】文件管理1.6

【操作系统学习笔记】文件管理1.6 参考书籍: 王道考研 视频地址: Bilibili 文件存储空间管理 存储空间的划分与初始化 安装 Windows 操作系统的时候&#xff0c;一个必经步骤是磁盘分区。每个区分为目录区&#xff08;存放文件目录信息 FCB、用于磁盘存储空间管理的信息&am…

算法题 — 三个数的最大乘机

三个数的最大乘机 整型数组 nums&#xff0c;在数组中找出由三个数字组成的最大乘机&#xff0c;并输出这个乘积。&#xff08;乘积不会越界&#xff09; 重点考察&#xff1a;线性扫描 排序法&#xff1a; public static void main(String[] args) {System.out.println(so…

万字详解,Java实现低配版线程池

文章目录 1.什么是线程池2.线程池的优势3.原理4.代码编写4.1 阻塞队列4.2 ThreadPool线程池4.3 Worker工作线程4.4 代码测试 5. 拒绝策略5.1 抽象Reject接口5.2 BlockingQueue新增tryPut方法5.3 修改ThreadPool的execute方法5.4 ThreadPool线程池构造函数修改5.5 拒绝策略实现1…

YoloV8改进策略:Block改进|自研Block,涨点超猛

参考模型 参考的Block,如下图: 我对Block做了修改,修改后的结构图如下: 代码详解 from timm.models.layers import DropPathfrom torch import Tensor def channel_shuffle(x: Tensor, groups: int

1. C++ 编译期多态与运行期多态

C 编译期多态与运行期多态 今日的C不再是个单纯的“带类的C”语言&#xff0c;它已经发展成为一个多种次语言所组成的语言集合&#xff0c;其中泛型编程与基于它的STL是C发展中最为出彩的那部分。在面向对象C编程中&#xff0c;多态是OO三大特性之一&#xff0c;这种多态称为运…

Kubernetes-3

Kubernetes学习第3天 Kubernetes-31、查看实时的cpu和内存消耗1.1、kubectl top node 2、卷的使用2.1、什么是卷&#xff1f;1. 解决数据持久性问题2. Kubernetes 中的卷抽象概念3. 共享数据示例4. Kubernetes 中的卷使用5. 不同类型的卷6. 灵活、可靠的数据管理 2.2、联想到do…