小结
有了这么多优秀的开发工具,可以做出更高质量的Android应用。
当然了,“打铁还需自身硬”,想要写出优秀的代码,最重要的一点还是自身的技术水平,不然用再好的工具也不能发挥出它的全部实力。
在这里我也分享一份大佬自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料。在脑图中,每个知识点专题都配有相对应的实战项目,可以有效的帮助大家掌握知识点。
总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
本文已同步发表到我的技术微信公众号,扫一扫文章底部的二维码或在微信搜索 “程序员驿站”即可关注,不定期更新优质技术文章。同时,也欢迎加入QQ技术群(群号:650306310)一起交流学习!
电量优化一直是个老生常谈的话题,关于这块的文章已经有很多了,最近也在做这块东西,所以结合自己的理解写下这篇文章。好了开始我们今天的正题,关于这块的论述我按照下述结构进行。
电量消耗的全过程分析
手机设备会执行各种任务和各种复杂计算,如秀自拍图片上传朋友圈、秀直播等等,为了完成这些设备硬件会快速消耗手机电池电量。很明显,任务处理的越复杂,电量就会消耗的越多和越快,一眨眼的功夫电量就消耗完了,这个时候用户的手机顿时变成个累赘的砖头了,用户就会怀疑谁(哪个app)这么耗电,然后把它卸了!
写出耗电量低的应用的关键是要透彻理解它的全部过程。
在电子编程世界,这种硬件消耗电量 来执行任务的过程,叫做超时电流消耗,任何电子编程专业的人都会告诉你,你的设备的各项活动在相同时间内,消耗的电量是不同的。
比如,很多手机号称待机好几天,这个确实是真的,不过就是使用飞行模式放在家里什么都不干,确实可以甚至可以坚持10多天。但是我们一旦使用它,比如使用蜂窝式无线数据交换(3G4G)、屏幕保持唤醒状态等,手机电量就会很快被消耗掉。
作为开发者,我们很想知道我的应用执行的哪些任务消耗的电量是最多的?这个问题确实会很棘手。因为电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情(所以很多设备都把这个监测电量的功能阉割掉了)。
唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗(因为第三方硬件监测的时候是用的自己的供电而不是用的手机的电量)。
耗电情况,例如:打开屏幕,所有要使用CPU/GPU工作的动作都会唤醒屏幕,都会消耗电量。这和应用程序唤醒设备还不一样。比如使用叫醒闹钟(wake clock)、AlarmManager、JobSchedulerAPI。
手机哪些地方最耗电?
唤醒屏幕
当用户点亮屏幕的时候,意味着系统的各组件要开始进行工作,界面也需要开始执行渲染。
待机状态的电量消耗:
使用和唤醒屏幕后:
当设备从休眠状态中,被应用程序唤醒时,可以看到在第一次唤醒时,出现一条电量使用高峰线。
CPU唤醒使用
CUP 唤醒时的高峰线:
接下来就是后续的一些执行的消耗了:
当工作完成后,设备会主动进行休眠,这非常重要,在不使用或者很少使用的情况下,长时间 保持屏幕唤醒会迅速消耗电池的电量。
蜂窝式无线
当设备通过无线网发送数据的时候,为了使用硬件,这里会出现一个唤醒耗电高峰。接下来还 有一个高数值,这是发送数据包消耗的电量,然后接受数据包也会消耗大量电量 也看到一个峰值。
通常情况下,使用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/…
进入到$GOPATH/src/github.com/google/battery-historian目录下方
cd $GOPATH/src/github.com/google/battery-historian
运行 Battery Historian 1.执行命令:
go run setup.go
Compile Javascript files using the Closure compiler
2.接着在执行命令:
go run cmd/battery-historian/battery-historian.go [–port default:9999]
Run Historian on your machine (make sure 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:
battery-historian电量分析结果:
分析指标
下图是使用 adb 命令将采集的电量数据上传至 Battery Historian 而得到电量的分析情况。(我们可以通过包名过滤具体应用的耗电情况)
各指标的含义
- 横坐标: 横坐标就是一个时间范围,咱们的例子中统计的数据是以重置为起点,获取 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 | 电池健康状态的信息,这个信息一定程度上反映了这块电池使用了多长时间 |
尾声
你不踏出去一步,永远不知道自己潜力有多大,千万别被这个社会套在我们身上的枷锁给捆住了,30岁我不怕,35岁我一样不怕,去做自己想做的事,为自己拼一把吧!不试试怎么知道你不行呢?
改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!