引言
1. Android性能优化篇之内存优化--内存泄漏
2.Android性能优化篇之内存优化--内存优化分析工具
3.Android性能优化篇之UI渲染性能优化
4.Android性能优化篇之计算性能优化
5.Android性能优化篇之电量优化(1)——电量消耗分析
6.Android性能优化篇之电量优化(2)
7.Android性能优化篇之网络优化
8.Android性能优化篇之Bitmap优化
9.Android性能优化篇之图片压缩优化
10.Android性能优化篇之多线程并发优化
11.Android性能优化篇之数据传输效率优化
12.Android性能优化篇之程序启动时间性能优化
13.Android性能优化篇之安装包性能优化
14.Android性能优化篇之服务优化
介绍
当我们使用Android完成任务时,设备硬件正在快速消耗电池电量来完成这些任务。任务越繁重,消耗的电量越多越快。这样用户就会在想是哪一个应用导致电量消耗的怎么快的?
要想写出耗电量低的应用的关键是要透彻理解电量消耗的全部过程。
我们很想知道我的应用执行的哪些任务消耗的电量是最多的?这个问题确实会很棘手。电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情。唯一可行的方案是使用第三方监测电量的设备,这样才能够获取到真实的电量消耗(因为第三方硬件监测的时候是用的自己的供电而不是用的手机的电量)。1.电量消耗分析
待机状态的电量消耗
使用和唤醒屏幕后
当设备从休眠状态中,被应用程序假面唤醒时,你会看到在第一次唤醒时,这里有一条电量使用高峰线
CUP唤醒时的高峰线
后续的一些执行的消耗
值得注意的是当工作完成后,设备会主动进行休眠,这非常重要,在不使用或者很少使用的情况下,长时间保持屏幕唤醒会迅速消耗电池的电量。
蜂窝式无线
当设备通过无线网发送数据的时候,为了使用硬件,这里会出现一个唤醒好点高峰。接下来还有一个高数值,这是发送数据包消耗的电量,然后接受数据包也会消耗大量电量 也看到一个峰值。
所以我们指导了,开启无线模式这个过程非常耗电,那么硬件这块为了防止频繁开启关闭耗电,采取了一个无奈的办法,会在一个小段时间内保持开启模式,防止短时间内还有数据包需要接收。这些数据非常有用,可是 不是所有开发者都有这个第三方设备跟踪。但是使用Android L版本就可以利用到新的一系列的工具来优化应用程序的耗电。(这里显然不要考虑兼容性问题吧,我只是想测电量消耗问题,同一款APP在不同版本上耗电情况应该不会有太大影响。)
2.Battery Historian(电量使用记录分析工具)
Battery Historian是Android 5.0开始引入的新API。通过下面的指令,可以得到设备上的电量消耗信息:
2.1 配置分析环境
第一种 通过安装Docker环境来安装
因本人没有使用这种,想要了解的朋友可以参考文档
第二种 源码安装(1).GO环境安装下载
(2). 安装Git下载
(3). 安装Python下载
(4). 安装Java环境
(5). 下载Battery Historian源码并且运行
下载源码
go get -d -u github.com/google/battery-historian/
运行Battery Historian
cd $GOPATH/src/github.com/google/battery-historian
go run setup.go
开启服务
go run cmd/battery-historian/battery-historian.go
检查/battery-historian是否运行
登录网址 http://localhost:9999查看
详细可以参考Google官方的文档查看
2.2 导出电量发现文件
historian-V1
$ adb shell dumpsys batterystats > xxx.txt //得到整个设备的电量消耗信息
$ adb shell dumpsys batterystats > com.package.name > xxx.txt //得到指定app相关的电量消耗信息
historian-V2
android 6.0 以及以下版本
adb bugreport > bugreport.txt
android 7.0
adb bugreport bugreport.zip
2.3 开始分析
启动battery-historian服务,打开http://localhost:9999,上传bugreport.txt或者bugreport.zip文件
3.battery-historian分析
现在我们就来分析下面的面板:
横坐标
我们看到下面的横坐标是代表上海的时间.
坐标就是一个时间范围,咱们的例子中统计的数据是以重置为起点,获取bugreport内容时刻为终点。我们一共采集了多长时间的数据,图表下也有信息说明。(经其他人的反馈,这个坐标间隔是会随着时间的长度发生改变,所以要以你的实际情况为准。通过滚动鼠标来调整缩放级别)
纵坐标
纵坐标的数据有点多,我们来一个一个分析。
battery_level
电量等级我们看到面板的右边就是电量等级的指标,横着面板的黑线就代表电量等级,我们可以把鼠标放到上面来查看电量的等级值。
也可以在横坐标的battery_level来查看
显示当前时间,电量等级等等。
CPU running
界面的状态,主要判断是否处于idle的状态。用来判断无操作状态下电量的消耗。
Userspace wakelock
wake_lock 该属性是记录wake_lock模块的工作时间。是否有停止的时候等
Screen
屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息。
Top app
该栏显示当前时刻哪个app处于最上层,就是当前手机运行的app,用来判断某个app对手机电量的影响,这样也能判断出该app的耗电量信息。该栏记录了应用在某一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助。
Activity Manager Proc
Mobile signal strength
移动信号强度
Wifi scan
wifi扫描的时间
Wifi supplicant
当前wifif状态
Wifi radio
wifi信号
Wifi signal strength
wifi信号强度
Wifi running
wifi是否连接
Wifi on
wifi是否开启
Audio
音频播放的时间点
Temperature
当前手机温度
Plugged
充电状态,这一栏显示是否进行了充电,以及充电的时间范围。
Charging on
是否在充电
health
电池健康状态的信息,这个信息一定程度上反映了这块电池使用了多长时间。
这一栏记录电池状态在何时发生改变,上面的图中电池状态一直处于good状态。plug
充电方式,usb或者插座,以及显示连接的时间。
这一栏显示了不同的充电方式对电量使用的影响。Job
后台的工作,比如服务service的运行。从下面图中可以看到qihoo的AppStore和鲁大师都在运行后台服务。
data_conn
数据连接方式的改变,上面的edge是说明采用的gprs的方式连接网络的。此数据可以看出手机是使用2g,3g,4g还是wifi进行数据交换的。这一栏可以看出不同的连接方式对电量使用的影响。
status
电池状态信息,有充电,放电,未充电,已充满,未知等不同状态。
这一栏记录了电池状态的改变信息。phone_signal_strength
手机信号状态的改变。
这一栏记录手机信号的强弱变化图,依次来判断手机信号对电量的影响。Sync
是否跟后台同步.
可以把鼠标停在某一项上面。可以看到何时sync同步 启动的,持续时间Duration多久。
电池容量不会显示单一行为消耗的具体电量,这里只能显示使用电池的频率和时长,你可以看分时段的剩余电量来了解具体消耗了多少电量。
wake_lock_in
wake_lock有不同的组件,这个地方记录在某一个时刻,有哪些部件开始工作,以及工作的时间。
gps
gps是否开启
phone_in_call
是否进行通话