前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android耗电量线下监控: Battery Historian

Android耗电量线下监控: Battery Historian

原创
作者头像
小木箱
修改于 2020-11-27 02:43:23
修改于 2020-11-27 02:43:23
1.6K061
代码可运行
举报
文章被收录于专栏:性能优化性能优化
运行总次数:61
代码可运行

改不完的 Bug,写不完的矫情。公众号 杨正友 现在专注移动基础平台开发 ,涵盖音视频, APM和信息安全等各个知识领域;只做全网最 Geek 的公众号,欢迎您的关注!精彩内容不容错过~

一. 发热案例分析

Android 框架层通过一个名为 batterystats 的系统服务,电池的信息电压温度充电状态等等,都是由BatteryService来提供的。 电池的这些信息是BatteryService通过广播主动把数据传送给所关心的应用程序。实现了电量统计的功能,batterystats实现原理可以查阅电量统计服务 Android 提供的 dumpsys 命令用于查看系统服务的信息(实现原理可以查阅 dumpsys 介绍) 将batterystats作为参数,就能输出完整的电量统计信息。小编在日本最大的游戏直播平台之一项目组开发过一段时间发现直播页面发热问题一直饱受日本用户诟病,因此我准备出一篇技术文章详细介绍整个优化流程,经过功能测试发现: 如果在游戏直播中播放视频,手机很快就会发烫。针对这种现象,我马上拉取数据进行了分析,测试数据表明游戏直播耗电量竟然高达 7%,经过调研,发现 Battery Historian 这个框架还挺合适线下优化的

二. 发热测试工具

2.1 开发环境

首先确保你的电脑已经安装,并配置好以下相关环境变量:

  1. Python 2.7 环境
  2. Docker 环境
  3. go 1.8.1 环境
  4. adb 环境

然后你还得准备一台 Android 5.0 以上手机,因为 Battery Historian 是在 Android 5.0 以上运行环境上跑的,最后 找一台适合高富帅的 Mac OS X 系统,实在没有就拿乞丐版 window 操作~

2.2 Battery Historian 使用指南

接下来我们来看一下 Battery Historian 具体使用:

2.2.1 使用 Docker 监听 battery-historian 9999 端口
2.2.2 配置 go 的环境
2.2.3 通过 go 下载 Battery Historian 源码
2.2.4 运行 Battery Historian
2.2.5 手机连上我们的 USB,先唤醒 Battery Historian 然后再清空电池历史状态
2.2.6 断开 USB ,打开测试应用,疯狂测试,20 分钟后将 bugreport_xxx 版本.zip 文件导出,通过命令将该文件上传到http://localhost:9999 即可
2.2.7 查看当前进程的关键信息

图片可能不是很清楚,我这边再给大家总结一下核心参数信息

参数

参数说明

Sync

是否跟后台同步,可以把鼠标停在某一项上面。可以看到何时 sync 同步 启动的,持续时间 Duration 多久。电池容量不会显示单一行为消耗的具体电量,这里只能显示使用电池的频率和时长,你可以看分时段的剩余电量来了解具体消耗了多少电量。

wake_lock_in

wake_lock 有不同的组件,这个地方记录在某一个时刻,有哪些部件开始工作,以及工作的时间。

wake_lock

wake_lock 该属性是记录 wake_lock 模块的工作时间。是否有停止的时候等。Android 的休眠唤醒主要基于 wake_lock 机制,只要系统中存在任一有效的 wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作。wake_lock 一般在关闭 lcd、tp 但系统仍然需要正常运行的情况下使用,比如听歌、传输很大的文件等。

running

界面的状态,主要判断是否处于 idle 的状态。用来判断无操作状态下电量的消耗。

plugged

充电状态,这一栏显示是否进行了充电,以及充电的时间范围。例如上图反映了我们在第 22s 插入了数据线,然后一直持续了数据采集结束

screen

屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息。

top

该栏显示当前时刻哪个 app 处于最上层,就是当前手机运行的 app,用来判断某个 app 对手机电量的影响,这样也能判断出该 app 的耗电量信息。该栏记录了应用在某一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助。

三. 发热测试过程

我们首先找出一款被骂的最狠的一款测试手机 xx 三星 xx 版本,电池容量:3000mAh,游戏直播和秀场直播以及直播回放 WiFi 环境下,打开 App,播放同一个测试直播源资源分别测试 20 分钟。

测试场景是这样的

  • 通过 小木箱 的账号进入游戏开播竖屏页面,开启游戏直播
  • 通过 小木箱 的账号进入直播回放竖屏页面, 进行直播回放
  • 通过 小木箱 的账号进入秀场直播竖屏页面, 开启秀场直播

为了保证测试数据的准确性,要保证四点,第一点是,手机不要灭屏,因为屏幕唤醒本身就会有耗电开销,第二点是不要使用蜂窝网络,这样测试的数据才具备公正性,第三点:把没有用到的传感器关掉,最后在测试过程不要充电,保持测试环境的一致性。

测试完毕后,在导航栏选中你的进程 ID

关注 App Status 两个核心指标

  • CPU User Time
  • Device estimated power use
  • 测试时长

关注这三个指标,从测试结果可以看到,你的对照组和样本组的测试结果了,由于测试数据比较核心,就不方便对外公布了。对于复杂的业务 需要拿多组实验组 和 一组对照组 结合Battery Historian 进行对比试验,然后找出差异点,逐步排查优化

直播应用耗电量的问题: 无非就建立 socket 连接过程中.推送心跳包,会定时唤醒 CPU 这样可能会有耗电风险,然后如果自定义 View 设计不合理,进行高频刷新 UI,也会造成耗电,而且本公司产品 UI 布局设计很不合理,布局嵌套很严重,存在重复渲染问题。当然如果你们应用在播放礼物,什么送跑车,送游艇,脸萌效果这样都可能会耗电,耗电最根本的操作就是要解决底层的 wake_lock 及时释放,因为 wake_lock 可以保证 CPU 进行休眠

三. 耗电优化建议

  • 省电这一块 主要是需要控制 wakelock 的使用。控制无谓的 CPU 运行和计算
  • 频繁定位类的 App 确实是耗电大户,可以在非必须的情况下,采用缓存数据,或者通过简化业务流程的情况下来进行优化
  • 避免在后台进行日志上报以及前台进行拉活工作
  • 如果面有一些任务的队列里面积累了大量的任务,每次都循环的执行任务太久,耗电会明显,要及时的进行清理工作
  • 对于网络请求或者 websocket 通信要对数据进行 gzip 压缩处理
  • 数据解析不要使用原生的 JSONObject ,应该使用 Gson jackson ptoBuffer 或者其他数据解析工具

四. 总结

本文主要是从我私下技术调研,利用线下工具 Battery Historian 分析企业 app 电池发热问题,电池的信息电压温度充电状态,Device estimated power use 这几个指标是耗电测试的关键指标,眼光放长远点我们可以通过动态代理方式 hook wake_lock 持有时长和 alarm 阀值 来预判 alarm 是否在做定时的重复任务 基于这几点我们可以大胆预设做一套符合企业规则的耗电 APM 体系,固然工作很曲折,如: 在 Android P 之后,很多的 Hook 点都不支持了。 所以测试范围有限~ 但是我们耗电这块可以针对固定低端机测试也不是非得全量测试,总比手动排雷来得方便~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Centos7解决MySQL登录ERROR 1045 (28000): Access denied for user ‘‘@‘localhost‘ (using
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor:yes)
OwenZhang
2021/12/08
4.7K0
Centos7解决MySQL登录ERROR 1045 (28000): Access denied for user ‘‘@‘localhost‘ (using
如何解决ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO) MySQL5和MySQL8
摘要: 在MySQL中,遇到ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: NO)错误,意味着MySQL拒绝了root用户的访问请求。这个问题通常与密码设置或权限配置错误有关。本文将详细介绍MySQL 5和MySQL 8版本下的解决方法,帮助用户快速解决该问题。通过这些技术解决方案,你可以轻松修复MySQL连接错误,并提高数据库的安全性和访问权限管理能力。本文将涵盖常见的错误排查步骤、权限修复方法以及如何重新设置MySQL root用户的密码,特别适用于开发人员、系统管理员以及数据库管理员。
猫头虎
2025/04/14
1.2K0
Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ 完美解决方法
遇到 Error 1045 (28000): Access denied for user ‘root’@‘localhost’ 错误是新手在配置 MySQL 时的常见问题。这通常意味着 root 用户无法通过提供的密码访问 MySQL 服务器。本篇文章将详细介绍导致这一问题的原因,并提供多种解决方案,帮助你彻底解决此问题。最后还有我的微信供大家交流。
默 语
2024/12/28
3K0
Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ 完美解决方法
Error 1045 (28000):Access Denied for User ‘root‘@‘localhost‘ 完美解决方法
摘要 大家好,我是默语。在这篇文章中,我们将详细解析 MySQL 数据库中常见的错误之一——Error 1045 (28000)。该错误通常表示“Access Denied for User ‘root’@‘localhost’”,即“访问被拒绝,用户 ‘root’@‘localhost’”。我们将探讨这个错误的根本原因,提供详尽的解决方案,并通过实际示例帮助你有效解决此问题。无论你是数据库管理员还是开发者,这篇文章将帮助你快速解决访问权限问题。
默 语
2024/11/22
9180
1045 Access denied for user 'root'@'localhost' (using password: YES)
MySQL 连接错误,使用Navicat连接MySQL出现错误:1045 Access denied for user 'root'@'localhost' (using password: YES)
acoolgiser
2019/01/17
24.3K0
重置密码遇到ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using passwor:yes)问题
在文档内搜索mysqld定位到[mysqld]文本段: /mysqld(在vim编辑状态下直接输入该命令可搜索文本内容)
kirin
2020/11/24
1.4K0
Ubuntu下MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
回到 vim  /etc/mysql/mysql.conf.d/mysqld.cnf将刚才加入的那一行“skip-grant-tables”注释或删除掉。
玩蛇的胖纸
2018/07/25
5.2K0
Ubuntu下MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
解决Java应用程序中的SQLException:Access denied for user ‘root‘@‘localhost‘ 错误
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at BookManagement.<init>(BookManagement.java:23) at BookManagement.main(BookManagement.java:66)
命运之光
2024/03/20
6.8K0
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES/NO) 解决方案1.停止mysql
初次安装mysql,net start mysql,然后输入mysql -u root -p,
一个会写诗的程序员
2018/08/17
105.4K4
Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ — 完美解决方案详解 ️
大家好,我是默语!今天我们要深入探讨一个让很多MySQL用户头疼的问题:Error 1045 (28000): Access denied for user ‘root’@‘localhost’。这是在登录MySQL数据库时常见的错误提示,意味着用户无法使用root账户访问数据库。本文将详细分析该错误的成因,并提供多种解决方案,帮助大家迅速解决问题。关键词:MySQL、Error 1045、Access denied、root账户、数据库权限、MySQL登录问题。
默 语
2024/11/22
2.1K0
mysql密码忘记(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using )
一.ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
风起--追风
2022/11/01
1.4K0
MySQL提示ERROR 1698 (28000): Access denied for user ‘root’@’localhost’错误解决办法
linuxidc@linuxidc:~/www.linuxidc.com$ mysql --version mysql  Ver 14.14 Distrib 5.7.27, for Linux (x86_64) using  EditLine wrapper
星哥玩云
2022/08/18
2.4K0
MySQL提示ERROR 1698 (28000): Access denied for user ‘root’@’localhost’错误解决办法
在Linux环境下mysql的root密码忘记解决方法
方法一: 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库。 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没有密码保护的 状态下,其他的用户也可以任意地登录和修改MySQL的信息。可以采用将MySQL对外的端口封闭,并且停止Apache以及所有的用户进程的方法实现服务器的准安全状态。最安全的状态是到服务器的Console上面操作,并且拔掉网线。 2.修改MySQL的登录设置:  # vi /etc/my.cnf  在[mysqld]的段中加上一句:ski
joshua317
2018/04/09
1.2K0
ERROR 1045 (28000): Access denied for user
centos6.5 mysql5.6 安装好mysql,密码正确但是报下面的错误!!解决办法!
斯文的程序
2019/11/07
2.4K0
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
问题 [root@node1 text]# mysql -uroot -p123456 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) [root@node1 text]# 停止mysql [root@node1 text]# service mysqld stop Stopping mysqld: [
程裕强
2022/05/06
7210
MySQL 5.7及8.0版本数据库的root密码遗忘的解决办法
注:MySQL5.7破解root密码,跳过密码认证登录到数据库,直接修改表中的密码即可,但是MySQL 8.0则不可以这样修改root密码,需要跳过密码认证登录到数据库后,先将root密码设置为空,然后才可以登录到数据库,修改root密码。
小手冰凉
2020/05/19
1.3K0
windows mysql 8.0 ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
步骤1:先关闭MySQL服务,然后使用“–skip-grant-tables”配置项,跳过权限验证方式重启MySQL服务:
MickyInvQ
2020/09/27
2.7K0
windows mysql 8.0 ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
mysql5.7 ERROR 1045 (28000): Access denied for user 'root'@'localhost'
初次安装mysql,net start mysql,然后输入mysql -u root -p,出现enter password,我直接点击回车,结果出现如果下错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)。网上看了很多方法,都是千篇一律的,没有解决我的问题
似水的流年
2018/01/14
9230
MySQL输入密码出现ERROR 1045(28000)ACCESS denied for错误解决方法
本人的网站www.appjzw.com是安装centos7系统下面,采用的是LAMP环境,使用的是MySQL环境,今天准备进入数据库更改字符段时,发现无法进入数据,输入密码回车后出现“ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) ”错误:
IDC科技
2020/04/21
8.3K0
MySQL输入密码出现ERROR 1045(28000)ACCESS denied for错误解决方法
MySQL连接错误1045:完美解决指南
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐅🐾🍁🐥
猫头虎
2024/04/09
3.8K0
MySQL连接错误1045:完美解决指南
推荐阅读
Centos7解决MySQL登录ERROR 1045 (28000): Access denied for user ‘‘@‘localhost‘ (using
4.7K0
如何解决ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO) MySQL5和MySQL8
1.2K0
Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ 完美解决方法
3K0
Error 1045 (28000):Access Denied for User ‘root‘@‘localhost‘ 完美解决方法
9180
1045 Access denied for user 'root'@'localhost' (using password: YES)
24.3K0
重置密码遇到ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using passwor:yes)问题
1.4K0
Ubuntu下MySQL报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
5.2K0
解决Java应用程序中的SQLException:Access denied for user ‘root‘@‘localhost‘ 错误
6.8K0
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES/NO) 解决方案1.停止mysql
105.4K4
Error 1045 (28000): Access denied for user ‘root‘@‘localhost‘ — 完美解决方案详解 ️
2.1K0
mysql密码忘记(ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using )
1.4K0
MySQL提示ERROR 1698 (28000): Access denied for user ‘root’@’localhost’错误解决办法
2.4K0
在Linux环境下mysql的root密码忘记解决方法
1.2K0
ERROR 1045 (28000): Access denied for user
2.4K0
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
7210
MySQL 5.7及8.0版本数据库的root密码遗忘的解决办法
1.3K0
windows mysql 8.0 ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO)
2.7K0
mysql5.7 ERROR 1045 (28000): Access denied for user 'root'@'localhost'
9230
MySQL输入密码出现ERROR 1045(28000)ACCESS denied for错误解决方法
8.3K0
MySQL连接错误1045:完美解决指南
3.8K0
相关推荐
Centos7解决MySQL登录ERROR 1045 (28000): Access denied for user ‘‘@‘localhost‘ (using
更多 >
LV.4
安徽旭帆信息科技有限公司
目录
  • 一. 发热案例分析
  • 二. 发热测试工具
    • 2.1 开发环境
    • 2.2 Battery Historian 使用指南
      • 2.2.1 使用 Docker 监听 battery-historian 9999 端口
      • 2.2.2 配置 go 的环境
      • 2.2.3 通过 go 下载 Battery Historian 源码
      • 2.2.4 运行 Battery Historian
      • 2.2.5 手机连上我们的 USB,先唤醒 Battery Historian 然后再清空电池历史状态
      • 2.2.6 断开 USB ,打开测试应用,疯狂测试,20 分钟后将 bugreport_xxx 版本.zip 文件导出,通过命令将该文件上传到http://localhost:9999 即可
      • 2.2.7 查看当前进程的关键信息
  • 三. 发热测试过程
  • 三. 耗电优化建议
  • 四. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验