改不完的 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
  • 测试时长

关注这三个指标,从测试结果可以看到,你的对照组和样本组的测试结果了,由于测试数据比较核心,就不方便对外公布了

直播应用耗电量的问题: 无非就建立 socket 连接过程中.推送心跳包,会定时唤醒 CPU 这样可能会有耗电风险,然后如果自定义 View 设计不合理,进行高频刷新 UI,也会造成耗电,而且本公司产品 UI 布局设计很不合理,布局嵌套很严重,存在重复渲染问题。当然如果你们应用在播放礼物,什么送跑车,送游艇,脸萌效果这样都可能会耗电,耗电最根本的操作就是要解决底层的 welock 及时释放,因为 welock 可以保证 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 点都不支持了。 所以测试范围有限~ 但是我们耗电这块可以针对固定低端机测试也不是非得全量测试,总比手动排雷来得方便~

Android耗电量线下监控: Battery Historian相关推荐

  1. android 耗电分析工具,使用Battery Historian工具分析Android耗电分析

    Android8.0以上分析使用Energy Profiler,低版本使用Battery Historian,为了降低配置的难度建议使用docker容器运行Battery Historian镜像 在d ...

  2. 【Android 电量优化】电量优化 ( 耗电量测试 | Battery Historian 简介 | apt 源更新 | Docker 安装 | Battery Historian 安装 )

    文章目录 一.耗电量测试 二.Battery Historian 简介 三.Docker 简介 四.更新 apt 源 五.安装 Docker 六.安装 Battery Historian 七.访问电量 ...

  3. 【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )

    文章目录 一.Battery Historian 环境要求 二.上传电量报告 三.Battery Historian 电量分析报告 四.电量优化三原则 五.电量优化注意事项 参考 Google 官方文 ...

  4. 【Android 电量优化】电量优化 ( 获取电量分析报告 | 阿里云服务器搭建 Battery Historian | 上传并生成分析报告 )

    文章目录 一.Battery Historian 搭建环境 二.获取 Android 手机电量报告 1.重置电量状态 2.开启获取 WeakLock 信息 3.获取手机电量报告 三.阿里云服务器搭建 ...

  5. Android 功耗优化(1)----使用Battery Historian生成电量消耗报告

    性能优化之电量优化-使用Battery Historian生成电量消耗报告 1 数据准备 1.1 先断开adb服务,然后开启adb服务 (a)adb kill-server 1 这一步很重要,因为当我 ...

  6. android 解压zip报错_Android 使用 Batterystats 和 Battery Historian 分析电池用量

    Android 使用 Batterystats 和 Battery Historian 分析电池用量 专注于Android开发,分享经验总结,欢迎加入 Android开发中涉及到耗电量怎么分析呢 go ...

  7. 19 | 耗电优化(下):耗电的优化方法与线上监控

    相比启动.卡顿.内存和网络的优化来说,可能大多数应用对耗电优化的关注不是太多.当然并不是我们不想做耗电优化,更多时候是感觉有些无从下手. 不同于启动时间.卡顿率,耗电在线上一直缺乏一个可以量化的指标. ...

  8. Android 使用 Batterystats 和 Battery Historian 分析电池用量

    Android 使用 Batterystats 和 Battery Historian 分析电池用量 专注于Android开发,分享经验总结,欢迎加入 Android开发中涉及到耗电量怎么分析呢 go ...

  9. 耗电量统计:可构建低电耗应用-Battery Historian

    官方解说 新的作业调度 API 支持您将系统作业推迟到后期或特定情况(例如,设备在充电或已连接到 Wi-Fi),从而最大延长电池寿命. 新的 dumpsys batterystats 命令会生成耗电量 ...

最新文章

  1. c++ 弹出菜单在固定的位置_固定资产管理软件操作手册(资产维修)
  2. python正则匹配日期2019-03-11_都2019年了,正则表达式为啥还是这么难?这里的Python学习教程教你搞定!...
  3. mysql新加不了数据库_MySQL数据库之mysql增加新用户无法登陆解决方法
  4. Python项目实践:文本进度条
  5. android 移植 距离感应,Android sensors移植文档
  6. 互动教程 for Excel 2016
  7. 我花了一夜用数据结构给女朋友写个H5走迷宫游戏
  8. 计算机c盘被保护怎么解开,电脑磁盘被写保护怎么办?总结几种去掉电脑磁盘写保护的方法...
  9. 从亏损19亿到盈利6亿,恺英网络做对了什么?
  10. 【每日蓝桥】7、一三年省赛Java组真题“核桃的数量”
  11. 计算机 哈弗结构图,作为一个程序员,不知道什么是冯诺依曼体系结构?那肯定也不知道哈佛结构喽!...
  12. 360度全景标定方法_全景摄像机标定方法综述
  13. 3.处理机调度——作业调度算法与进程调度算法
  14. 使用css渐变色。实现动态进度条效果
  15. 黑苹果安装的驱动含义
  16. LeetCode 720. 词典中最长的单词
  17. django迁移数据库乱了,彻底重新再来的步骤
  18. linux红帽子怎么设置防火墙,RedHat Linux如何设置防火墙
  19. 权威解读GitHub、Apache疑云:主流开源软件究竟是否会被闭源?| 独家
  20. 经纬恒润AUTOSAR全面适配芯驰车规芯片,联合打造全场景国产解决方案

热门文章

  1. self.location.href、top.location.href、localtion.href、有什么不同
  2. mysql php b s_PHP-- B/S结构
  3. 美容美发行业的私域搭建
  4. Win7 + Ubuntu 16.04 双系统安装
  5. micropython做中继_utime – 时间相关的功能
  6. 功能化M-IRPA-MOF负载型催化剂-单原子Ca-MOF纳米复合催化剂
  7. SSM SpringBoot vue服装厂管理系统
  8. Innodb独立表空间的配置
  9. banq、J道——相见恨晚!
  10. unity向服务器发送xml文件格式,Unity读取Excel文件转换XML格式文件的方法