当前位置: 首页 > news >正文

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

相关文章:

Android耗电分析之Battery Historian工具使用

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

vue el-avatar 使用require提示无法找到图片

报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案...

深入理解 C# 中的 Task:异步编程的利器

深入理解 C# 中的 Task:异步编程的利器 前言一、Task 的基本概念什么是 Task?为什么要使用 Task? Task 的使用方法创建 Task等待 Task 完成Task 返回结果 Task 的进阶用法Task 异常处理Task 同步执行Task 并发限制 Task 的实际应用场景并行计…...

YOLOv9电动车头盔佩戴检测,详细讲解模型训练

向AI转型的程序员都关注了这个号👇👇👇 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来,已经在目标检测领域取得了显著的进展,以其快速和准确的特点而广受欢迎。 论文地址&#xf…...

OpenStack之Nova

一 、Nova 使用OpenStack Compute来托管和管理云计算系统。 OpenStack Compute是基础架构即服务 (IaaS)系统的主要部分。 主要模块在Python中实现: 1因为认证,与OpenStack 身份认证keystone 交互。 2因为磁盘和服务器镜像&#xf…...

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球,给人留下深刻的印象。作为前端开发人员,可以通过不断学习和掌握设计技巧和工具,提升自己的UI设计能力,为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议: 学习设计基础知…...

嵌入式学习第二十六天!(网络传输:TCP编程)

TCP通信: 1. TCP发端: socket -> connect -> send -> recv -> close 2. TCP收端: socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数: 1. co…...

【LeetCode】升级打怪之路 Day 14:二叉树的遍历

今日题目: 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …...

[Unity实战]使用NavMeshAgent做玩家移动

其实除了Character Controller, Rigidbody,我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方(毕竟基于烘焙过的导航网格),一般常见于元宇宙应用和mmo。 根据Unity手册,NavMeshAgent 也有和…...

官网:随便搞个?那不如不搞,搞不好就给公司减分了。

官网建设确实需要认真对待,不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响,降低品牌形象和用户体验。以下是一些官网建设的重要原则: 专业性:官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…...

Ansible 基础入门

2)Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具,基于 Paramiko 开发的,并且基于模块化工作,Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,它是基于 Python 语言&#xf…...

讨论:5万官网是建站界的劳斯莱斯了吧,到了软件开发领域呢?

如题,所以赛道选择很重要,当然难度系数也不一样。能花5万元做官网的,凤毛麟角,如果是做软件开发,5万元顶多算个起步价,老铁们,是这样吗?...

手写分布式配置中心(三)增加实时刷新功能(短轮询)

要实现配置自动实时刷新,需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center​​​​​​​ 服务端改造 服务端增加一个版本号version,新增配置的时候为1,每次更新配置就加1。 Overridepublic long insertConfigDO(…...

【RabbitMQ】WorkQueue

📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 Work Queues Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息 当消息处理比较耗时的时候&…...

国内免费好用 Chat GPT推荐

无论您是寻找技术洞见还是灵感激发,此网站是您的绝佳去处。探索着名作家的精彩观点和创意解决方案,它不仅是知识的源泉,更是思维的驱动力。在这里,您将发现无尽的学习资源和启发,助您不断前行这是一款基于OpenAi开发的…...

基于springboot实现在线考试系统项目【项目源码+论文说明】

基于springboot实现在线考试系统演示 摘要 时代在变化,科技技术以无法预测的速度在达到新的高度,并且被应用于社会生活的各个领域,随着生活的加快,也使很多潜在的点逐渐突显出来,社会对于人才的要总是非常迫切的&…...

golang中go build 后读取配置文件

golang打包后读取配置文件 在用go写代码的时候,为了好用经常使用go build 打包,如果我们用到了配置文件,就总是导致不能找到文件所在位置了出现bug,所以以下代码就解决了这个问题。 核心代码: file, err : exec.Look…...

为raspberrypi编译bpftrace调试工具

基于eBPF的嵌入式应用调试 笔者之前写过几篇有关于使用eBPF调试Linux内核和应用的博客,其中提到,在嵌入式设备上使用BCC或bpftrace是不可行的;主要原因在于嵌入式设备的资源有限,而这两个调试工具依赖python/clang/llvm等库&…...

分段线性化问题探析

目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…...

从零学算法2917

2917.给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数: 只有在 nums 中,至少存在 k 个元素的第 i 位值为 1 ,那么 K-or 中的第 i 位的值才是 1 。 返回 nums 的 K-or 值。 注意 &#xf…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

HTML 列表、表格、表单

1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

uniapp中使用aixos 报错

问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...