通过google的开源工具Battery-Historian来进行分析电量消耗
工具开源地址: [https://github.com/google/battery-historian]
安装Battery Historiany的方式有两种。
分别为Docker与源码编译安装。
Docker安装
Docker有Community Edition (CE 社区版) and Enterprise Edition (EE 企业版)两种版本。我们使用社区版就可以了。
安装好Docker之后,github上让我们运行
但是这个地址貌似需要翻墙。我们可以使用镜像
docker run --name=battery -d -p 9999:9999 bhaavan/battery-historian
一段漫长的等待……
然后
表示启动成功了
源码编译安装
需要存在go、git、python与java环境。
对于linux/Mac一般默认会携带python与git,如果不存在或者版本不正确也可以(brew install)。
sudo apt-get install golang
sudo apt-get install git
sudo apt-get install python2.7
安装go
Go 和java一样是一个编程语言,并且是开源的。因为Battery Historiany使用了go来开发,所以我们需要安装go环境。
我们需要安装go,最低需要 1.8.1的版本
选择自己需要安装的系统下载。第二列的Kind表示类型,有source源码(需要自己编译安装)、Installer安装器(下一步、下一步安装)与Archive编译好的(需要配置环境变量)。
安装完成后,使用go version
我们需要确保能够调起go工具,否则需要配置go环境变量。
Git工具
按照官网提示来进行安装就可以了
安装Python
python必须使用2.7的版本,
https://www.python.org/downloads/
安装完成可以使用python –V 检查是否安装成功。
安装 java
java没什么好说的了。下载安装,配置环境变量……
运行
4个工具都安装完成之后,我们就可以下载BH源码并运行了
我们进入GOPTAH目录,下载源码与其依赖:
然后我们运行bh
然后我们可以访问
如何进行电量优化
- 屏幕亮暗相关
- 设备 awake,sleep 的切换,尤其是唤醒.
- CPU 运行相关
- 网络
- 传感器
监听是否在充电
/**
* 是否正在充电
* @return
*/
public static boolean isPlugged(Context context){
//发送个包含充电状态的广播,并且是一个持续的广播
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent intent = context.registerReceiver(null,filter);
//获取充电状态
int isPlugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
boolean acPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_AC;
boolean usbPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_USB;
boolean wifiPlugged = isPlugged == BatteryManager.BATTERY_PLUGGED_WIRELESS;
return acPlugged || usbPlugged || wifiPlugged;
}
我们可以通过判断当前手机充电状态去决定是否处理某些任务。比如:360 手机助手,当充上电的时候,才会自动清理手机垃圾,自动备份上传图片、联系人 等到云端,从而避免当用户手机低电量时,任然继续进行耗电操作。
WakeLock
wake_lock 锁主要是相对系统的休眠而言的,意思就是程序给 CPU 加了这个锁那系统就不会 休眠了,这样做的目的是为了全力配合我们程序的运行。有的情况如果不这么做就会出现一些 问题。
需要使用 PowerManager 这个系统服务的唤醒锁(wake locks)特征来保持 CPU 处于唤醒状 态。唤醒锁允许程序控制宿主设备的电量状态,创建和持有唤醒锁对电池的续航有较大的影 响,所以,除非是真的需要唤醒锁完成尽可能短的时间在后台完成的任务时才使用它。比如在 Acitivity 中就没必要用了。
只有一种合理的使用场景,使用后台服务在屏幕关闭情况下 hold 住 CPU 完成一些工作,需要 使用唤醒锁,如果不使用唤醒锁来执行后台服务,不能保证因 CPU 休眠未来的某个时刻任务 会停止,这不是我们想要的。
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
//只唤醒cpu
PowerManager.WakeLock locationLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "location_lock");
//使CPU一直处于工作状态,手动调用release来关闭
locationLock.acquire();
注意:在使用该类的时候,必须保证 acquire 和 release 是成对出现的。不然当我们业务已经不需要时, 当 CPU 处于唤醒状态,这个时候就会损耗多余的电量。
JobScheduler
自 Android 5.0 发布以来,JobScheduler 已成为执行后台工作的很好的方式,其工作方式有 利于用户在适当的时机执行正确的事情。应用可以在安排作业的同时允许系统基于内存、电源 和连接情况进行优化。JobSchedule 的宗旨就是把一些不是特别紧急的任务放到更合适的时机 批量处理。这样做有两个好处:
- 避免频繁的唤醒硬件模块,造成不必要的电量消耗。
- 避免在不合适的时间(例如低电量情况下、弱网络或者移动网络情况下的)执行过多的
任务消耗电量。
GPS
选择合适的 Location Provider
Android 系统支持多个 Location Provider:
- GPS_PROVIDER: GPS 定位,利用 GPS 芯片通过卫星获得自己的位置信息。定位精准度高,一般在 10 米左右, 耗电量大;但是在室内,GPS 定位基本没用。
-
NETWORK_PROVIDER: 网络定位,利用手机基站和 WIFI 节点的地址来大致定位位置,这种定位方式取决于服务器,
即取决于将基站或 WIF 节点信息翻译成位置信息的服务器的能力。 - PASSIVE_PROVIDER: 被动定位,就是用现成的,当其他应用使用定位更新了定位信息,系统会保存下来,该应用接 收到消息后直接读取就可以了。
如果 App 只是需要一个粗略的定位那么就不需要使用 GPS 进行定位,既耗费电量,定位的耗 时也久。
参考代码
[https://github.com/games2sven/Battery_Improve]
有疑问加站长微信联系(非本文作者)