Android 常用命令和工具解析之Battery Historian
Batterystats是包含在 Android 框架中的一种工具,用于收集设备上的电池数据。您可以使用adb bugreport命令抓取日志,将收集的电池数据转储到开发机器,并生成可使用 Battery Historian 分析的报告。Battery Historian 会将报告从 Batterystats 转换为可在浏览器中查看的 HTML 可视化内容。适合的场景:
- 显示进程从什么位置以及通过何种方式消耗电池电量
- 识别系统为了延长电池续航时间可能会延迟甚至移除应用中的哪些任务。
当设备在使用电池的时候,它可以使开发者们看到系统级和应用级事件图表,在图表时间轴上可以缩放和平移,能够直观的看到自上一次充满电到现在设备电池的统计汇总信息,它可以选中一个应用程序来检查该应用影响电池电量的一些参数,并且可以对比两个bugreport文件信息分析,并对其电池关键区别点做高亮显示。
一、Battery Historian
Battery Historian的安装可以参考:https://download.csdn.net/blog/column/11547800/108662887
其他参考:Android性能优化系列之电量优化_android 电量优化-CSDN博客
1、基本操作
但是通常企业里面基本上都搭建了,所以直接使用解析bugreport文件就行了,解析后主界面如下:
- 右上角通常选择Battery Level,即中间会出现一根黑线,那根黑线就是剩余电量
- 左侧纵轴为一些比较关键的字段,把鼠标移动到上面会自动显示相关说明
- 底部横轴为时间线,可以通过鼠标轮滑来放大和缩小,且时间比较精准
1.1 CPU running
表示设备上 CPU 处于活动状态(非休眠状态)的时间。这是指 CPU 在处理各种任务时所花费的时间,包括应用程序的执行、系统服务的处理以及其他系统任务。CPU running 时间通常用于衡量设备在特定时间段内的活动水平,以便评估设备的能耗情况。
如上图表示CPU持续运行了45小时,所以这里的CPU running还并不像性能分析里面的轮询片段
1.2 App Processor wakeup
在 Battery Historian 中,App Processor wakeup 表示应用处理器(通常是设备上的主 CPU)从睡眠状态唤醒的次数。当应用处理器从睡眠状态唤醒时,它需要消耗额外的电量来执行任务,这可能会导致设备的电池消耗增加。
App Processor wakeup 是一个重要的指标,用于衡量应用程序或系统活动导致应用处理器频繁唤醒的情况。频繁的唤醒事件可能表明有一些应用程序或系统服务在不必要地唤醒设备,从而导致电池消耗增加。这可能是由于应用程序执行了过多的后台任务、使用了不当的定时器或触发器,或者存在其他导致设备频繁唤醒的问题。
个人理解此字段表示应用进程被唤醒的次数,当然这里的应用进程可能是前台进程也可能是后台进程。
如上图表示此时间点wisemine应用被唤醒一次,但是注意如果缩短时间轴,他会把相近的几次组合,即如上三个点表示三次被唤醒,合在一起如下:
Bugreport保存此字段的原理可以参考BugReport中的App Processor wakeup字段意义-CSDN博客
1.3 Kernel only uptime
在 Battery Historian 中,Kernel only uptime 表示设备的内核(Kernel)仅处于运行状态而不是睡眠状态的时间。内核是操作系统的核心组件,负责管理系统资源、处理任务调度、驱动设备等。当内核处于运行状态时,设备通常会消耗更多的电量。
Kernel only uptime 是一个重要的指标,用于了解设备内核在特定时间段内的活动水平。较长的 Kernel only uptime 可能表明设备的内核在处理各种系统任务时一直处于活动状态,这可能会导致额外的能源消耗,影响设备的电池寿命。
1.4 Userspace wakelock
1.5 Long Wakelocks
1.6 Screen
通过监视 Battery Historian 中的 "Screen" 数据,用户可以了解设备屏幕的使用情况,包括屏幕开启时长、亮度变化等信息。这有助于用户评估自己的屏幕使用习惯,以及了解哪些应用程序或活动可能导致屏幕开启时间过长,从而影响设备的电池寿命。
如上图红色表示屏幕是亮起来的,白色表示屏幕没有亮起来,放大时间轴之后能够清晰的得到屏幕亮起来的原因和时长:
1.7 Top app
在 Battery Historian 中,"Top app" 表示在特定时间段内消耗最多电量的应用程序。这个指标可以帮助用户和开发人员了解哪些应用程序在设备上消耗了大量的电量,从而帮助他们识别可能导致电池耗尽的应用程序或活动。
通过监视 Battery Historian 中的 "Top app" 数据,用户可以查看哪些应用程序在特定时间段内使用了大量的电量。这有助于用户优化其应用程序使用习惯,可能会减少对电量消耗较高的应用程序的使用,或者寻找更节能的替代方案。
如上图表示在此时间点最活跃的几个应用,按照持续时间排名,放大时间轴会发现,这里同样会被合并:
PS:此项如果以点的形式表现通常没有太大的意义,可能是待机状态下突然亮屏,或者某个应用突然启动起来;但是如果持续时间很长,就能够证实对应的应用可能存在异常,因为持续很长时间在持续耗电。
1.8 Foreground process
在 Battery Historian 中,"Foreground process" 表示在设备上处于前台运行状态的进程或应用程序。前台进程通常是用户当前正在与之交互的应用程序,因为用户正在使用这些应用程序,它们通常会占用更多的系统资源,包括 CPU、内存和电量。
这个是指的前台进程,表示当前在设备上处于前台运行状态的进程或应用程序。这些是用户当前正在与之交互的应用程序,它们通常会占用更多的系统资源和电量。但是top app不一样,他无法指示对应应用在后台一直运行或者一直占用系统资源,他只能说明当时他瞬间消耗的电流比较高而已。
如上表示对应的三个进程一直在占用系统资源,持续45小时
值得注意的是,如果状态有所改变,Historian会自动区分颜色
1.9 JobScheduler
在 Battery Historian 中,"JobScheduler" 是指 Android 系统中的一个调度器,用于在设备空闲时执行后台任务。JobScheduler 允许应用程序安排需要在后台执行的作业或任务,以便在系统资源可用时进行处理,从而提高电量效率和系统性能。
通过使用 JobScheduler,开发人员可以利用系统优化功能,将多个后台任务聚合在一起执行,从而减少设备唤醒次数,节省电量并减少对系统资源的占用。这有助于避免应用程序在不必要的时候频繁唤醒设备,从而提高设备的电池寿命。
PS:即JobSchedule的宗旨就是把一些不是特别紧急的任务放到更合适的时机批量处理。但是感觉他对日常分析好像没有什么太大的作用?
1.10 Activity Manager Proc
在 Battery Historian 中,"Activity Manager Proc" 是指 Android 系统中的一个关键组件,用于管理应用程序进程和活动。Activity Manager Proc 负责跟踪和管理应用程序的进程生命周期、活动状态以及与系统资源的交互。
通过监视 Activity Manager Proc 数据,可以了解应用程序在设备上的运行情况,包括其进程的创建、销毁、活动状态的变化等。这些信息对于分析应用程序的性能、资源利用情况以及对设备电量消耗的影响非常重要。
如上截图,红色的表示对应进程死亡的瞬间,绿色表示对应进程被启动
同样如果时间轴比较小,他会把这些圆点进行组合
1.11 AM Low Memory / ANR
"AM Low Memory" 表示 Android 系统的 Activity Manager 在低内存条件下的一种状态。在这种情况下,系统可能会采取一些措施来释放内存,例如终止一些后台进程、清理缓存等,以确保系统的稳定性和性能。
其中"Num Process" 的数值表示在低内存条件下 Activity Manager 监视的当前进程数量。这个指标可以帮助开发人员了解系统在低内存状态下所管理的进程数量,以及系统在释放内存时可能终止的进程数量。
1.12 Doze
"Doze" 表示设备的省电模式。省电模式是 Android 系统提供的一种功能,旨在延长设备的电池寿命,通过限制应用程序的后台活动来减少电量消耗。以下是 "Doze" 中常见的三种状态及其含义:
- Doze Off:表示设备的省电模式已关闭,设备未进入任何省电模式。在 Doze Off 状态下,设备不会应用省电模式的限制,应用程序可以自由运行而不受 Doze 模式的影响。
- Light Doze:表示设备处于轻度睡眠模式。在 Light Doze 状态下,系统会限制某些后台活动以节省电量,但仍允许应用程序在一定程度上保持活动状态。
- Full Doze:表示设备处于深度睡眠模式。在 Full Doze 状态下,系统会极大限制应用程序的后台活动,包括网络访问和同步操作,以最大程度地减少电量消耗。
通常为了降低功耗,我们希望要求设备在禁止待机状态下更多的处于深度睡眠模式,即PMS原生逻辑在禁止状态没有任何输入和用户锁的情况下,是否能够进入浅度睡眠模式?进入之后又会有一些条件判断是否能够进入深度睡眠模式?进入深度睡眠模式之后后台被限制,后台网络同步操作将在一个固定的周期时间点触发,这样大大节约功耗。如果去掉Full Doze模式,那么后台任务将会频繁被唤起,大大提升功耗,可以参考后面案例。
1.13 Phone state
在Battery Historian中,Phone state表示手机通话状态,包括是否正在通话、接听来电、拨出电话
- "in":表示设备处于通话状态,即设备正在进行电话通话或有电话呼入的状态。
- "out":表示设备处于拨打电话状态,即设备正在拨打电话。
- "off":表示设备处于电话关闭状态,即设备的电话功能处于关闭状态,没有电话呼入或呼出的情况
这些不同的状态可以帮助开发人员更好地了解设备在电话功能方面的运行状态,有助于诊断和解决与通信功能相关的问题。
如上截图可以了解到黑色的in表示当前设备正在通话中,黄色的out表示当前设备正在拨打电话
1.14 Phone scanning
在 bugreport 中,"Phone scanning" 表示设备正在进行电话扫描的操作。电话扫描是指设备在搜索可用的移动网络信号或其他通信信号的过程。这个信息可以帮助开发人员了解设备在扫描网络信号方面的状态。
- "off":表示电话扫描功能处于关闭状态,即设备当前未在进行网络信号的扫描。
- "on":表示电话扫描功能处于开启状态,即设备正在主动进行网络信号的扫描,以便连接到可用的网络信号。
1.15 Network connectivity
Network connectivity表示网络连接类型,总共如下几种类型,我们接触多的通常WIFI/MOBLE/VPN分别表示当前使用的wifi网络/移动网络/VPN网络
有时候可能同时使用了几种网络,如下图就会换一种颜色来表示,鼠标放到上面有详细的列表显示当前使用的网络类型
1.16 Mobile signal strength/Wifi signal strength
Mobile signal strength表示移动数据信号是否稳定,白色为none表示没有开启移动网络,黄色为good表示网络比较好,poor就表示网络比较差,这种情况下就越耗电
Wifi signal strength表示wifi信号是否稳定,同上在poor就表示当前wifi信号不稳定,这种情况下会持续耗电
1.17 Wifi scan/Wifi on/Wifi radio
Wifi ON表示当前时间段wifi功能是否打开,和settings菜单里面的wifi开关一致
Wifi radio表示当前时间段wifi硬件是否处于激活状态,注意和wifi功能进行区分
Wifi scan表示当前时间段wifi模块有没有进行wifi扫描,通常wifi扫描越频繁就越耗电
1.18 Wifi supplicant
在 Android 系统中,bugreport 是一个用于收集设备信息、日志和其他诊断数据的工具。在 bugreport 报告中,"Wifi supplicant" 是指与 Wi-Fi 连接相关的组件,该组件负责处理设备与 Wi-Fi 网络之间的通信。以下是 "Wifi supplicant" 在 bugreport 中可能出现的一些值以及它们的含义:
- SCANNING:表示 Wi-Fi supplicant 正在扫描可用的 Wi-Fi 网络。在这种状态下,设备正在搜索可用的 Wi-Fi 热点。
- ASSOCIATING:表示设备正在尝试与选定的 Wi-Fi 网络建立连接。在这个阶段,设备正在与 Wi-Fi 热点进行握手和认证过程。
- ASSOCIATED:表示设备已经成功与 Wi-Fi 网络建立连接。设备与 Wi-Fi 网络之间已经建立了通信通道。
- AUTHENTICATING:表示设备正在进行 Wi-Fi 网络的认证过程。在这个阶段,设备正在验证其身份以获得对 Wi-Fi 网络的访问权限。
- COMPLETED:表示设备已成功连接到 Wi-Fi 网络并已准备好进行数据传输。
- DISCONNECTED:表示设备与 Wi-Fi 网络的连接已断开。这可能是由于信号弱、网络故障或用户手动断开连接等原因导致的。
这些状态可能同时存在,但是状态存在改变的时候,颜色肯定会不一样,如下:
1.19 GPS/Sensor
Sensor和GPS的值都是on和off,on表示该模块处于开启工作状态
1.20 Coulomb charge/Battery Level/Temperature
Coulomb charge表示设备的电荷状态,描述电池的充电量或放电量;看起来单位是mAh,并随着剩余电量的降低,这个值越小,颜色越淡,它和Battery Level成正比
Battery Level表示当前剩余电量的百分比,从密集程度可以了解到好点是否均匀,它和电池曲线存在一些关联
Temperature表示设备当前温度,颜色越深说明温度越高
2、案例分析
2.1 应用持锁导致无法息屏
如上截图前面5个小时屏幕一直常亮,无法息屏
从Userspace wakelock和Foreground process可以看出DECT应用持锁持续五个小时,导致无法正常息屏
2.2 应用任务导致耗电模块持续运行
如上截图可以看出45小时一直在通话过程中,后续GPS频繁启动和扫描,让设备退出深度睡眠模式
后确定和这两个应用有关系。
2.3 WIFI信号不好导致功耗高
如上截图wifi信号poor,表示信号相当不好,会增加wifi模块的耗电量
2.4 无法深度睡眠导致功耗高
如上截图Doze一直为黄色,即浅度休眠,导致后台应用频繁被唤起,后了解到此项目关闭了深度睡眠。
相关文章:

Android 常用命令和工具解析之Battery Historian
Batterystats是包含在 Android 框架中的一种工具,用于收集设备上的电池数据。您可以使用adb bugreport命令抓取日志,将收集的电池数据转储到开发机器,并生成可使用 Battery Historian 分析的报告。Battery Historian 会将报告从 Batterystats…...

家用报警器的UML 设计及其在C++和VxWorks 上的实现01
M.W.Richardson 著,liuweiw 译 论文描述了如何运用 UML(统一建模语言)设计一个简单的家用报警器,并实现到 VxWorks 操作系统上。本文分两个部分,第一部分描述了如何用 UML 设计和验证家用报警器的模型,以使…...
k8s常见面试题2
k8s常见面试题2 安全与权限RBAC配置如何保护 Kubernetes 集群的 API Server?如何管理集群中的敏感信息(如密码、密钥)?如何限制容器的权限(如使用 SecurityContext)?如何防止容器逃逸࿰…...

CSS 伪类(Pseudo-classes)的详细介绍
CSS 伪类详解与示例 在日常的前端开发中,CSS 伪类可以帮助我们非常精准地选择元素或其特定状态,从而达到丰富页面表现的目的。本文将详细介绍以下伪类的使用: 表单相关伪类 :checked、:disabled、:enabled、:in-range、:invalid、:optional、…...

将Deepseek接入pycharm 进行AI编程
目录 专栏导读1、进入Deepseek开放平台创建 API key 2、调用 API代码 3、成功4、补充说明多轮对话 总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️🌈 博客主页:请点击——…...

【Ollama】一、介绍
介绍 Ollama 是一个开源项目,专注于提供本地化的大型语言模型(LLM)部署和运行解决方案。它允许用户在本地环境中轻松运行和微调各种开源语言模型(如 LLaMA、Falcon 等),而无需依赖云服务或高性能 GPU。Oll…...

ASP.NET Core JWT
目录 Session的缺点 JWT(Json Web Token) 优点: 登录流程 JWT的基本使用 生成JWT 解码JWT 用JwtSecurityTokenHandler对JWT解码 注意 Session的缺点 对于分布式集群环境,Session数据保存在服务器内存中就不合适了&#…...
查询引擎:它们是什么以及为什么重要
了解查询引擎、它们的优势以及如何简化现代应用程序的数据管理。查询引擎是高效处理和检索数据的强大工具,但并非所有查询引擎都能满足现代应用程序对速度和实时性的需求。在本文中,我们将解析查询引擎的定义、主要优势以及它们如何用于实时数据和AI应用…...

03/29 使用 海康SDK 对接时使用的 MysqlUtils
前言 最近朋友的需求, 是需要使用 海康sdk 连接海康设备, 进行数据的获取, 比如 进出车辆, 进出人员 这一部分是 资源比较贫瘠时的一个 Mysql 工具类 测试用例 public class MysqlUtils {public static String MYSQL_HOST "192.168.31.9";public static int MY…...
2025.2.7 Python开发岗面试复盘
2025.2.7 Python开发岗面试复盘 问题: 是否了解过其他语言? 了解过Java、JavaScript、C等语言,但主要技术栈是Python。 Python跟Java的区别? Python是解释型语言,Java是编译型语言 Python动态类型,Java静态类型 Python简洁易读,Java相对严谨复杂 Python GIL限制并发,Java并…...

一个sql只能有一个order by
ORDER BY 子句在 SQL 中只能出现一次,静态部分和动态部分只能写一个 ORDER BY...
Windows Docker笔记-在容器中运行项目
在文章《Windows Docker笔记-Docker容器操作》中,已经成功创建了容器,也就是建好了工厂,接下来就应该要安装流水线设备,即运行项目达到生产的目的。 在Ubuntu容器中新建项目 这里要新建一个简单的C项目,步骤如下&…...

postgreSQL16.6源码安装
1.获取源码 从PostgreSQL: File Browser获取tar.bz2或者tar.gz源码 2.解压 tar xf postgresql-version.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# tar xf postgresql-16.6.tar.bz2 roothwz-VMware-Virtual-Platform:/usr/local# ll 总计 24324 drwxr-xr-x 12 ro…...

寒假2.5
题解 web:[网鼎杯 2020 朱雀组]phpweb 打开网址,一直在刷新,并有一段警告 翻译一下 查看源码 每隔五秒钟将会提交一次form1,index.php用post方式提交了两个参数func和p,func的值为date,p的值为Y-m-d h:i:s a 执行fu…...
定期删除一周前的数据,日志表的表空间会增长吗?
即使定期删除一周前的数据,日志表的表空间仍可能持续增长。原因如下: 删除操作不释放空间:DELETE 操作只会标记数据为删除状态,并不会立即释放空间。这些空间可以被后续的 INSERT 操作重用,但不会自动缩减表的总大小。…...
yum 安装mysql
sudo yum install mysql-server sudo systemctl start mysqld sudo systemctl enable mysqld 获取临时 root 密码并登录 MySQL 安装完成后,MySQL 会生成一个临时的 root 密码。你可以通过查看日志文件来找到这个密码: sudo grep ‘temporary password’…...

Servlet笔记(下)
HttpServletRequest对象相关API 获取请求行信息相关(方式,请求的url,协议及版本) | API | 功能解释 | | ----------------------------- | ------------------------------ | | StringBuffer getRequestURL(); | 获取客户端…...
Windows 中学习Docker环境准备3、在Ubuntu中安装Docker
Windows 中学习Docker环境准备1、Win11安装Docker Desktop Windows 中学习Docker环境准备2、Docker Desktop中安装ubuntu Windows 中学习Docker环境准备3、在Ubuntu中安装Docker 需要更多Docker学习视频和资料,请文末联系 步骤 1:更新系统并安装依赖…...

【centOS】搭建公司内网git环境-GitLab 社区版(GitLab CE)
1. 安装必要的依赖 以 CentOS 7 系统为例,安装必要的依赖包: sudo yum install -y curl policycoreutils openssh-server openssh-clients postfix sudo systemctl start postfix sudo systemctl enable postfix2. 添加 GitLab 仓库 curl -sS https:/…...
Unity DoTween使用文档
DoTween 使用文档 DoTween 是 Unity 中非常流行的动画补间插件。它通过链式调用方式,让开发者可以快速创建平滑、自然的动画效果。本文将介绍 DoTween 的基础用法、缓动曲线原理(包含常见缓动曲线的数学公式与参数说明)、案例演示以及一些常…...

【办公类-99-01】20250201学具PDF打印会缩小一圈——解决办法:换一个PDF阅读器
背景需求: 2024年1月13日,快要放寒假了,组长拿着我们班的打印好的一叠教案来调整。 “前面周计划下面的家园共育有调整,你自己看批注。” “还有你这个教案部分的模版有问题,太小(窄)了。考虑…...
组合总和II(力扣40)
这道题的难点就在于题目所给的集合中有重复的数字,我们需要进行去重操作。首先明确去重指的是去重哪一部分。注意并不是对递归的集合去重,而是对当前集合的遍历进行去重。这么说可能有点抽象,举个例子:假设集合为1,1,2,3,4&#x…...
基于HTML生成网页有什么优势
在互联网时代,网页是人们获取信息、交流互动的重要窗口,而基于HTML生成网页,是搭建网络大厦的关键。HTML语法简洁直观,标签和属性语义明确,新手也能迅速上手,创建包含基础元素的网页,极大降低了…...
php 接入扣子的 token获取
本身逻辑只是个api,但是官方不提供php的sdk 扎心了老铁,这下php 狗都不用了,主要麻烦的是如何获取access_token,代码如下 protected function get_jwt(): string{$header [alg > RS256,typ > JWT,kid > $this->kid];…...

Redis02 - 持久化
Redis持久化 文章目录 Redis持久化一:持久化简介1:Redis为什么要进行持久化2:Redis持久化的方式 二:RDB持久化介绍1:手动触发RDB2:自动触发RDB3:redis.conf中进行RDB的配置4:RDB优缺…...

【力扣】240.搜索二维矩阵 II
题目 我的代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for(int i0;i<matrix.size();i){for(int j0;j<matrix[0].size();j){if(targetmatrix[i][j]){return true;}else if(target<matrix[i][j]){brea…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)
接上篇:《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》 链接 文章目录 4.安装RabbitMQ Messaging Topology Operator 裸金属环境部署RabbitMQ部署单实例部署集群 4.安装RabbitMQ Messaging Topology Operator 使用 cer…...

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama
随着开源 LLM 的发展,越来越多的模型变得专业化,“代码”LLM 变得非常流行。这些 LLM 旨在比其 “常识” 对应物更小,但旨在超越更大的通用模型的编码性能。 这些模型以极低的成本提供大型模型的功能,进一步使本地 LLM 空间民主化…...
11.kafka开启jmx
方式一: 1.进入/opt/kafka_2.13-3.3.2/bin目录 命令: cd /opt/kafka_2.13-3.3.2/bin [root@rhel77 ~]# cd /opt/kafka_2.13-3.3.2/bin [root@rhel77 bin]# pwd /opt/kafka_2.13-3.3.2/bin [root@rhel77 bin]# 2.备份kafka-run-class.sh 命令: cp kafka-run-class.sh …...
基于钉钉API的连接器实现:企业数据集成与自动化管理
文章目录 概要背景与需求钉钉API概述连接器实现小结 概要 在当今数字化时代,企业面临着海量数据的管理与整合挑战。钉钉作为国内广泛使用的办公协作平台,提供了丰富的API接口,支持企业进行数据集成与自动化管理。本文将介绍如何通过钉钉API实…...