大家项目中应该少不了使用无线循环的ViewPager吧,今天推荐一个无限循环的库,在阿里的仓库下,想必用得一定舒心,如果你需求,赶紧的~~
https://github.com/alibaba/UltraViewPager
UltraViewPager是一个封装多种特性的ViewPager,主要是为多页面切换场景提供统一解决方案。
本文由
黄俊彬
投稿。
黄俊彬
的博客地址:
http://www.jianshu.com/u/466f8b75f81c
电量优化,这个名词在传统PC时代,我们基本很少听见。然而到了诺基亚时代,我们也同样很少关注。
直到了移动互联的智能机时代。电量优化才被慢慢的重视起来。可能的原因如下:
-
移动设备,不能一直使用电源供电,且电池容量有限
-
对于用户来说, 实际上App的电量损耗也是用户体验的一个方面。 特别是当今人们对移动设备的依赖度越来越高
曾经我们一个BOSS发现使用APP,挂在后台。然后手机插着充电,然后睡了个觉。起床发现电量只充满了70-80%,然后... ...
最后发现是一个重要原因由于内测版本的长连接开启了日志记录,频繁的进行IO操作引起.
这个时候你还不能狡辩了,因为用户最简单能通过系统设置来查看应用的耗电量排名。
在电子编程世界,这种硬件消耗电量 来执行任务的过程,叫做超时电流消耗,
任何电子编程专业的人都会告诉你,你的设备的各项活动在相同时间内,消耗的电量是不同的。
比如,很多手机号称待机好几天,这个确实是真的,不过就是使用飞行模式放在家里什么都不干,确实可以甚至可以坚持10多天。但是我们一旦使用它,比如使用蜂窝式无线数据交换(3G4G)、屏幕保持唤醒状态等。
作为开发者,我们很想知道我的应用执行的哪些任务消耗的电量是最多的?这个问题确实会很棘手。电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情(所以很多设备都把这个监测电量的功能阉割掉了。)。
唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗(因为第三方硬件监测的时候是用的自己的供电而不是用的手机的电量)。
--Google电量优化-示例图--
(1)唤醒屏幕
当用户电量屏幕的时候,意味着系统的各组件要开始进行工作,界面也需要开始执行渲染。
待机状态的电量消耗:
使用和唤醒屏幕后:
当设备从休眠状态中,被应用程序假面唤醒时,你会看到在第一次唤醒时,这里有一条电量使用高峰线。
(2)CPU唤醒使用
CPU唤醒时的高峰线:
接下来就是后续的一些执行的消耗了:
当工作完成后,设备会主动进行休眠,这非常重要,在不使用或者很少使用的情况下,长时间保持屏幕唤醒会迅速消耗电池的电量
(3)蜂窝式无线
当设备通过无线网发送数据的时候,为了使用硬件,这里会出现一个唤醒好点高峰。接下来还有一个高数值,这是发送数据包消耗的电量,然后接受数据包也会消耗大量电量 也看到一个峰值。
通常情况下,使用3G移动网络传输数据,电量的消耗有三种状态:
-
Full power: 能量最高的状态,移动网络连接被激活,允许设备以最大的传输速率进行操作。
-
Low power: 一种中间状态,对电量的消耗差不多是Full power状态下的50%。
-
Standby: 最低的状态,没有数据连接需要传输,电量消耗最少。
电量使用优化, 基本上是我们最不怎么关注的一项优化。可能很多公司连QA/Tester也不会关注测试App电量的使用。
一般来说开发和测试的测试设备也一直是连着USB处于充电状态的,感官上也体会不到电量的损耗。
要进行电量优化,我们首先得知道电都消耗到那里去了,不然如何进行针对性的优化呢?
答案是通过google开源的Battery Historian来进行分析。
(1)电量数据收集
Android 5.0及以上的设备, 允许我们通过adb命令dump出电量使用统计信息.
1.因为电量统计数据是持续的, 会非常大, 统计我们的待测试App之前先reset下, 连上设备, 命令行执行:
$ adb shell dumpsys batterystats --reset
Battery stats reset.
2.断开测试设备, 操作我们的待测试App.
3.重新连接设备, 使用adb命令导出相关统计数据:
// 此命令持续记录输出, 想要停止记录时按Ctrl+C退出.
$ adb bugreport > bugreport.txt
导出的统计数据存储到bugreport.txt, 此时我们可以借助如下工具来图形化展示电池的消耗情况.
注意, 官方SDK文档导出文件方式为:
adb shell dumpsys batterystats > batterystats.txt
使用python historian.py batterystats.txt > batterystats.html查看数据
是battery-historian老版本的使用方式. 目前Battery Historian已更新2.0版本, 推荐使用bugreport方式导出数据分析, 可以看到更多信息.
(2)安装工具
工具开源地址:
https://github.com/google/battery-historian
根据gitbub上面介绍,Battery History工具的安装有两种方式:
-
通过安装Docker环境来安装。(这种方式很简单,Docker真心好用,太彪悍了!)
Docker是一种容器,一般用于云计算和大数据平台。提倡的一种思想就是:软件即服务。这句话不是盖的,一句话就可以将别人发布的docker服务环境一次全部copy过来(注意是整个软件环境哦,相当于复制了一台一模一样的主机,连软件都不要安装了,全有了。彪悍吧!)
Docker只支持Windows10
由于笔者使用的window,无法通过Docker的方式,所以是采用第2点进行安装
2.通过编译gitbub上面的源码来安装
这真是一个虐心的过程,因为Battery History是Go语言开发的。我们需要安装Go环境、Pytho环境、Git环境,并配置好相关的环境变量。具体的软件安装教程就不附上了,这里贴一下工具的下载地址。
Go下载地址:
https://golang.org/doc/install?download=go1.7.3.windows-amd64.msi
Python下载地址:
https://www.python.org/
Git下载地址:
https://git-scm.com/
需要注意的是, Battery Historian是Go语言的, 安装Go的时候需要配置其bin的环境变量.
Python环境需要是2.7的(3.x不行), 建议使用pyenv管理本地的python环境.
另外, 因为Battery Historian是一个网页版工具, 涉及一些JS引用, 有时需要爬梯子
安装及成功配置环境变量后
1.输入命令行
go get -d -u github.com/google/battery-historian/…
**下载到GOPATH配置目录下
2.进入到
$GOPATH/src/github.com/google/battery-historian目录下方
$ cd $GOPATH/src/github.com/google/battery-historian
3.运行Battery Historian
1) go run setup.go
Compile Javascript files using the Closure compiler
$ go run setup.go
等待数分钟或者10分钟左右,如果仍然没有下载成功,可以手动下载,如下操作
**下载【closure-library】和【closure-compiler】和【flot-axislabels】,解压放到GOROOT目录下third_party文件夹下方的的closure-compiler和closure-library和flot-axislabels文件夹 ../battery-historian\third_party;如果没有均手动创建
2)go run cmd/battery-historian/battery-historian.go
Run Historian on your machine (make sure $PATH contains $GOBIN)
$ go run cmd/battery-historian/battery-historian.go [--port <9999>]
4.检查/battery-historian是否运行,
登录网址
http://localhost:9999查看
千呼万唤使出来,不容易。这里建议使用Chrome浏览器,并且一定要使用VPN,不然各种莫名的问题
(3)分析指标
工具安装完成后,我们将adb采集的数据上传至Battery Historian,就可以得到电量的分析情况。
那么关键来了,这些指标具体代表什么含义呢?这里我们来做一下解释。
1.横坐标
横坐标就是一个时间范围,咱们的例子中统计的数据是以重置为起点,获取bugreport内容时刻为终点。我们一共采集了多长时间的数据
2.纵坐标
关键的数据点我们用表格来汇总一下。
数据项
|
含义
|
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进行数据交换的。这一栏可以看出不同的连接方式对电量使用的影响
|