Android电量优化全解析 ,赶快收藏备战金九银十
作为开发者,我们很想知道我的应用执行的哪些任务消耗的电量是最多的?这个问题确实会很棘手。因为电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情(所以很多设备都把这个监测电量的功能阉割掉了)。
唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗(因为第三方硬件监测的时候是用的自己的供电而不是用的手机的电量)。
耗电情况,例如:打开屏幕,所有要使用CPU/GPU工作的动作都会唤醒屏幕,都会消耗电量。这和应用程序唤醒设备还不一样。比如使用叫醒闹钟(wake clock)、AlarmManager、JobSchedulerAPI。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mmZSDRb-1630654848689)(https://user-gold-cdn.xitu.io/2019/2/19/16904494d4b73834?imageView2/0/w/1280/h/960/ignore-error/1)]
手机哪些地方最耗电?
唤醒屏幕
当用户点亮屏幕的时候,意味着系统的各组件要开始进行工作,界面也需要开始执行渲染。
待机状态的电量消耗:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yc51MEeO-1630654848691)(https://user-gold-cdn.xitu.io/2019/2/19/16904494d8e08b81?imageView2/0/w/1280/h/960/ignore-error/1)]
使用和唤醒屏幕后:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11KsKYd7-1630654848692)(https://user-gold-cdn.xitu.io/2019/2/19/16904494d8f47c41?imageView2/0/w/1280/h/960/ignore-error/1)]
当设备从休眠状态中,被应用程序唤醒时,可以看到在第一次唤醒时,出现一条电量使用高峰线。
CPU唤醒使用
CUP 唤醒时的高峰线:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sar5zK51-1630654848694)(https://user-gold-cdn.xitu.io/2019/2/19/1690449502c37a5a?imageView2/0/w/1280/h/960/ignore-error/1)]
接下来就是后续的一些执行的消耗了:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GXsrp7Z-1630654848695)(https://user-gold-cdn.xitu.io/2019/2/19/16904494d902b4bf?imageView2/0/w/1280/h/960/ignore-error/1)]
当工作完成后,设备会主动进行休眠,这非常重要,在不使用或者很少使用的情况下,长时间 保持屏幕唤醒会迅速消耗电池的电量。
蜂窝式无线
当设备通过无线网发送数据的时候,为了使用硬件,这里会出现一个唤醒耗电高峰。接下来还 有一个高数值,这是发送数据包消耗的电量,然后接受数据包也会消耗大量电量 也看到一个峰值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ntU4qfZ3-1630654848696)(https://user-gold-cdn.xitu.io/2019/2/19/1690449500830c48?imageView2/0/w/1280/h/960/ignore-error/1)]
通常情况下,使用3G移动网络传输数据,电量的消耗有三种状态:
- Full power: 能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进 行操作。
- Low power: 一种中间状态,对电量的消耗差不多是 Full power 状态下的 50%。
- Standby: 最低的状态,没有数据连接需要传输,电量消耗最少。
Battery-Historian 电量分析工具的使用
要进行电量优化,我们首先得知道电都消耗到哪里去了,我们可以通过 google 开源的 Battery-Historian 来进行分析。
工具开源地址: github.com/google/batt…
Battery History 工具安装
根据 gitbub 上面介绍,Battery History 工具的安装有两种方式:
方式1: 通过安装 Docker 环境来安装。(这种方式很简单,Docker 真心好用)
- 按照 Docker 网站上的说明安装 Docker Community Edition。
- 使用以下命令运行 Battery Historian 镜像:
docker --run -p port_number:9999 gcr.io/android-battery-historian:2.1 --port 9999
方式2 通过编译 gitbub 上面的源码来安装。
- GO 环境安装:具体可以参考 Mac os 安装 golang 开发环境(www.jianshu.com/p/79bdd20c4…)
- 安装 git.
- 安装 Python。仅支持 python2.7 (www.python.org/ )
- 安装Java环境
下载 Battery Historian 源码并且运行
输入如下命令行 下载到GOPATH 配置目录下。
go get -d -u github.com/google/battery-historian/...
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fEXkyePL-1630654848697)(https://user-gold-cdn.xitu.io/2019/2/19/169044950f7ff0c9?imageView2/0/w/1280/h/960/ignore-error/1)]
进入到$GOPATH/src/github.com/google/battery-historian目录下方
cd $GOPATH/src/github.com/google/battery-historian
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMbbG35Y-1630654848698)(https://user-gold-cdn.xitu.io/2019/2/19/1690449521c619b4?imageView2/0/w/1280/h/960/ignore-error/1)]
运行 Battery Historian 1.执行命令:
go run setup.go
Compile Javascript files using the Closure compiler
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V6dpDK3S-1630654848698)(https://user-gold-cdn.xitu.io/2019/2/19/169044952bff31cf?imageView2/0/w/1280/h/960/ignore-error/1)]
2.接着在执行命令:
go run cmd/battery-historian/battery-historian.go [--port <default:9999>]
Run Historian on your machine (make sure [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2drI9ujB-1630654848699)(https://juejin.im/equation?tex=PATH%20contains)]GOBIN) 3.登录网址http://localhost:9999查看battery-historian是否运行。
到此Battery-historian的环境就整好了。
电量数据收集
Android 5.0 及以上的设备, 允许我们通过 adb 命令 dump 出电量使用统计信息。 1.因为电量统计数据是持续的, 会非常大, 统计待测试的 App 之前需要连上设备,因此需要reset(重置)电池数据收集。命令行执行:
$ adb shell dumpsys batterystats --resetBattery stats reset
2.断开usb连接的测试设备, 操作要测试的App。
3.重新连接设备, 使用 adb 命令导出相关统计数据:
- Android 7.0 及以上执行如下命令:
adb bugreport > [path/]bugreport.zip
- Android 5.0/ 6.0执行如下命令:
adb bugreport > [path/]bugreport.txt
导出的统计数据存储到 bugreport.zip(bugreport.txt), 借助 battery-historian 工具来图形化 展示电池的消耗情况.
上传 bugreport.zip(bugreport.txt)文件至 http://localhost:9999:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkDZ4ILQ-1630654848700)(https://user-gold-cdn.xitu.io/2019/2/19/16904495415d3f21?imageView2/0/w/1280/h/960/ignore-error/1)]
battery-historian电量分析结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PBUsFxaf-1630654848700)(https://user-gold-cdn.xitu.io/2019/2/20/16908e42f78a7e7d?imageView2/0/w/1280/h/960/ignore-error/1)]
分析指标
下图是使用 adb 命令将采集的电量数据上传至 Battery Historian 而得到电量的分析情况。(我们可以通过包名过滤具体应用的耗电情况)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FytRGiKy-1630654848701)(https://user-gold-cdn.xitu.io/2019/2/20/16908e42f78a7e7d?imageView2/0/w/1280/h/960/ignore-error/1)]
各指标的含义
- 横坐标: 横坐标就是一个时间范围,咱们的例子中统计的数据是以重置为起点,获取 bugreport 内容时 刻为终点。我们一共采集了多长时间的数据;
- 纵坐标: 关键数据点说明如下。
数据项 | 说明 |
---|---|
battery_level | 电量,可以看出电量的变化 |
plugged | 充电状态,这一栏显示是否进行了充电,以及充电的时间范围 |
screen | 屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息 |
top | 该栏显示当前时刻哪个 app 处于最上层,就是当前手机运行的 app,用来判断某个 app 对手机电量的影响,这样也能判断出该 app 的耗电量信息。该栏记录了应用在某 一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助 |
wake_lock | wake_lock 该属性是记录 wake_lock 模块的工作时间。是否有停止的时候等 |
running | 界面的状态,主要判断是否处于 idle 的状态。用来判断无操作状态下电量的消耗 |
Job | 后台的工作,比如服务 service 的运行 |
data_conn | 数据连接方式的改变,上面的 edge 是说明采用的 gprs 的方式连接网络的。此数据可 以看出手机是使用 2g,3g,4g 还是 wifi 进行数据交换的。这一栏可以看出不同的连 接方式对电量使用的影响 |
status | 电池状态信息,有充电,放电,未充电,已充满,未知等不同状态 |
phone_signal_strength | 手机信号状态的改变。 这一栏记录手机信号的强弱变化图,依次来判断手机信号对电 量的影响 |
health | 电池健康状态的信息,这个信息一定程度上反映了这块电池使用了多长时间 |
plug | 充电方式,usb 或者插座,以及显示连接的时间 |
Sync | 是否跟后台同步 |
phone_in_call | 是否进行通话 |
gps | gps 是否开启 |
如何进行电量优化?
了解手机关键耗电的地方及分析耗电的工具后。接下来就是我们的核心,如何来进行电量的优 化?首先我们先简单总结汇总一下耗电的相关因素
- 屏幕亮暗相关
- 设备 awake,sleep 的切换,尤其是唤醒.
- CPU 运行相关
- 网络
- 传感器
我们都知道屏幕的渲染及 CPU 的运行是耗电的主要因素之一。所以当我们在做内存优化、渲染优化、计算优化的时候,就已然在做电量优化。所以在平时的开发中,我们要注意点滴性能 的优化积累,实际上当我们来做电量分析的时候,也是在找自己挖的坑。所以尽量有意识在项 目的开发过程中尽量少挖坑,这一点是我们在分析其他优化项首先要提到的一个点。
监听手机充电状态
我们可以通过下面的代码来获取手机的当前充电状态:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gFSxTxx8-1630654848702)(https://user-gold-cdn.xitu.io/2019/2/19/16904495484320f7?imageView2/0/w/1280/h/960/ignore-error/1)]
得到充电状态信息之后,我们可以有针对性的对部分代码做优化。比如我们可以判断只有当前 手机为 AC 充电状态时 才去执行一些非常耗电的操作。可以通过下面的方法判断手机当前的充 电状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AK6ZUtjx-1630654848702)(https://user-gold-cdn.xitu.io/2019/2/19/1690449548fb6b47?imageView2/0/w/1280/h/960/ignore-error/1)]
这里我们就需要思考,根据具体的业务,考虑将一些不需要及时地和用户交互的操作放到充电 的时候去做。比如:360 手机助手,当充上电的时候,才会自动清理手机垃圾,自动备份上传图片、联系人 等到云端,从而避免当用户手机低电量时,任然继续进行耗电操作。
屏幕唤醒
当 Android 设备空闲时,屏幕会变暗,然后关闭屏幕,最后会停止 CPU 的运行,这样可以防 止电池电量掉的快。但有些时候我们需要改变 Android 系统默认的这种状态:比如玩游戏时我 们需要保持屏幕常亮,比如一些下载操作不需要屏幕常亮但需要 CPU 一直运行直到任务完成。
保持屏幕常亮比较好的方式是在 Activity 中使用 FLAG_KEEP_SCREEN_ON 的 Flag。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iuxKnkxh-1630654848703)(https://user-gold-cdn.xitu.io/2019/2/19/16904495558a8e3a?imageView2/0/w/1280/h/960/ignore-error/1)]
这个方法的好处是不像唤醒锁(wake locks),需要一些特定的权限(permission)。并且能 正确管理不同 app 之间的切换,不用担心无用资源的释放问题。
另一个方式是在布局文件中使用 android:keepScreenOn 属性:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6xkdgUF0-1630654848703)(https://user-gold-cdn.xitu.io/2019/2/19/16904495828e4789?imageView2/0/w/1280/h/960/ignore-error/1)]
android:keepScreenOn = “true”的作用和 FLAG_KEEP_SCREEN_ON 一样,使用代码的好 处是你允许你在需要的地方关闭屏幕。
注意:一般不需要人为的去掉 FLAG_KEEP_SCREEN_ON 的 flag,windowManager 会管理好程序进入 后台回到前台的的操作。如果确实需要手动清掉常亮的 flag,使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pW8zylqX-1630654848704)(https://user-gold-cdn.xitu.io/2019/2/19/169044957b65ed32?imageView2/0/w/1280/h/960/ignore-error/1)]
所以这里我们需要根据自己的 APP 实际情况,根据业务来控制好是否保持屏幕常量。比如 APP 需要支持视频播放。那么在播放的界面需要控制好不熄屏,当退出播放时,当然就没有了 这个设置。
LAG_KEEP_SCREEN_ON 的 flag,windowManager 会管理好程序进入 后台回到前台的的操作。如果确实需要手动清掉常亮的 flag,使用
[外链图片转存中…(img-pW8zylqX-1630654848704)]
所以这里我们需要根据自己的 APP 实际情况,根据业务来控制好是否保持屏幕常量。比如 APP 需要支持视频播放。那么在播放的界面需要控制好不熄屏,当退出播放时,当然就没有了 这个设置。
Android电量优化全解析 ,赶快收藏备战金九银十相关推荐
- Android高级工程师面试实战,赶快收藏备战金九银十!
开头 作为一个40的人,能有面试机会是格外的珍惜,也分外的诚恳.没什么豪言壮语,雄心大志.没有狼性,社会把中年人打磨成了听话的舔狗. 感谢马爸爸旗下公司,给了我为数不多机会中一个,而且还是个相当好的位 ...
- 美团点评APP在移动网络性能优化的实践,赶快收藏备战金九银十!
导语 事情是这样的,一个关注我公众号很久了的朋友,最近跟我说要去面试阿里P6,其实他的水平P7是够了的,他开发了6年,一直在学习新的技术,Flutter,NDK,这些都有涉及,年纪也不是很大26岁,之 ...
- 整理几个重要的Android知识,赶快收藏备战金九银十!
基本情况 先说一下个人基本情况,计算机科学与技术专业.主要学的Android开发,所以投的岗位都是Android开发工程师.投了知乎,内推了阿里蘑菇街腾讯百度网易.腾讯百度都没有收到面试,知乎Skyp ...
- 怒斩获了30家互联网公司offer,赶快收藏备战金九银十!
前言 马爸爸总结了一句话:跳槽,要么是钱不到位,要么是受了委屈. 我给自己这次的跳槽经历做了一个分析,希望能对那些想换工作的朋友有所帮助. 许多朋友想换工作,但是对"换工作"的理解 ...
- java静态变量初始化顺序,赶快收藏备战金九银十!
1. Redis面试专题 绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知.这里以面试题的形式 ...
- 5G音视频时代还不学NDK开发吗?赶快收藏备战金九银十!
我,来自大山. 我,不甘平凡. 笔者80后,出生在江西一个偏远的山村.虽然出生时已经不是那个温饱都是问题的年代,但是也谈不上有个幸福的童年.家里很穷.幼儿园并没有读,因为家里觉得花那个钱没有必要,小学 ...
- 闭关28天,奉上[Java一线大厂高岗面试题解析合集],备战金九银十
前言 时间不等人,2022年转眼就要过去大半了,春招在疫情中度过,不知有多少人还在惋惜... 马上又是秋招的高峰"金九银十",估计现在就已经有不少的程序猿(媛)朋友早就踏上提前批之 ...
- 万字长文,冲刺备战金九银十,奉上[Java一线大厂高岗面试题解析合集]
时间不等人,2022年转眼就要过去大半了,春招在疫情中度过,不知有多少人还在惋惜... 马上又是秋招的高峰"金九银十",估计现在就已经有不少的程序猿(媛)朋友早就踏上提前批之路了吧 ...
- 备战金九银十,腾讯T4梳理2022年最全999道Java岗必备面试题答案
Java集合/泛型面试题 1.ArrayLi st和1inkedList的区别 2.HashMap和HashT abl e的区别 3.Collecti on包结构,与Collections的区别 4. ...
- 备战金九银十,腾讯 T4 梳理 2022 年最全 999 道 Java 岗必备面试题答案
前言 今年马上又准备迎接金九银十了,你是否还在寻找没有"996"的公司,或者你在面试上面摘了跟头?准备了体体面面的自我介绍,败在了技术深度上:又或者技术知识背得完完全全,却输在了面 ...
最新文章
- Ways to 优化JAVA程序设计和编码,提高JAVA性能
- DevExpress的TreeList实现显示本地文件目录并自定义右键实现删除与重命名文件
- 删除驱动符号链接出错-变量作用域和RtlInitUnicodeString的问题
- 计算机丢失wininet,win7系统启动程序提示因为计算机中丢失wininet.dll的解决方法...
- c/c++拷贝构造函数和关键字explicit
- php 405跳转,php – 返回HTTP 405的CORS预检请求
- python md5加密数据
- Redis学习总结(22)——Redis的主从复制是如何做的?复制过程中也会产生各种问题?
- python 神经网络_100行Python代码,轻松搞定神经网络 !
- linux:文件及目录管理
- iOS开发-dispatch_once相关
- 在 360 度绩效评估中应该问的 20 个问题
- [回头再说] 国内网页游戏背景音乐
- Java中的七种设计原则
- 给语音信号加混响的常用方法(方法一)
- noip by 20XZH02
- 淘宝批量下载图片方法
- iOS中 扫描二维码/生成二维码详解
- 提高免疫力的食物 十种提升免疫力食材
- 付费专栏热销排行榜·0315更新