改不完的 Bug,写不完的矫情。公众号 杨正友 现在专注移动基础平台开发 ,涵盖音视频, APM和信息安全等各个知识领域;只做全网最 Geek 的公众号,欢迎您的关注!精彩内容不容错过~
Android 框架层通过一个名为 batterystats 的系统服务,电池的信息,电压,温度,充电状态等等,都是由BatteryService来提供的。 电池的这些信息是BatteryService通过广播主动把数据传送给所关心的应用程序。实现了电量统计的功能,batterystats实现原理可以查阅电量统计服务 Android 提供的 dumpsys 命令用于查看系统服务的信息(实现原理可以查阅 dumpsys 介绍) 将batterystats作为参数,就能输出完整的电量统计信息。小编在日本最大的游戏直播平台之一项目组开发过一段时间发现直播页面发热问题一直饱受日本用户诟病,因此我准备出一篇技术文章详细介绍整个优化流程,经过功能测试发现: 如果在游戏直播中播放视频,手机很快就会发烫。针对这种现象,我马上拉取数据进行了分析,测试数据表明游戏直播耗电量竟然高达 7%,经过调研,发现 Battery Historian 这个框架还挺合适线下优化的
首先确保你的电脑已经安装,并配置好以下相关环境变量:
然后你还得准备一台 Android 5.0 以上手机,因为 Battery Historian 是在 Android 5.0 以上运行环境上跑的,最后 找一台适合高富帅的 Mac OS X 系统,实在没有就拿乞丐版 window 操作~
接下来我们来看一下 Battery Historian 具体使用:
图片可能不是很清楚,我这边再给大家总结一下核心参数信息
参数 | 参数说明 |
---|---|
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 两个核心指标
关注这三个指标,从测试结果可以看到,你的对照组和样本组的测试结果了,由于测试数据比较核心,就不方便对外公布了。对于复杂的业务 需要拿多组实验组 和 一组对照组 结合Battery Historian 进行对比试验,然后找出差异点,逐步排查优化
直播应用耗电量的问题: 无非就建立 socket 连接过程中.推送心跳包,会定时唤醒 CPU 这样可能会有耗电风险,然后如果自定义 View 设计不合理,进行高频刷新 UI,也会造成耗电,而且本公司产品 UI 布局设计很不合理,布局嵌套很严重,存在重复渲染问题。当然如果你们应用在播放礼物,什么送跑车,送游艇,脸萌效果这样都可能会耗电,耗电最根本的操作就是要解决底层的 wake_lock 及时释放,因为 wake_lock 可以保证 CPU 进行休眠
本文主要是从我私下技术调研,利用线下工具 Battery Historian 分析企业 app 电池发热问题,电池的信息,电压,温度,充电状态,Device estimated power use 这几个指标是耗电测试的关键指标,眼光放长远点我们可以通过动态代理方式 hook wake_lock 持有时长和 alarm 阀值 来预判 alarm 是否在做定时的重复任务 基于这几点我们可以大胆预设做一套符合企业规则的耗电 APM 体系,固然工作很曲折,如: 在 Android P 之后,很多的 Hook 点都不支持了。 所以测试范围有限~ 但是我们耗电这块可以针对固定低端机测试也不是非得全量测试,总比手动排雷来得方便~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。