使用电量分析工具
Google提供的开源的电池分析工具
Battery Historian.
按照README,安装即可。
Battery Historian 需要配置GO语言环境。
Battery Historian 是网页版,一些JS的引用要翻墙。
Android 5.0以上设备 ,通过adb命令导出dump电量使用历史信息。
步骤:
adb kill-server
adb start-server
// 打开电池数据获取
adb shell dumpsys batterystats --enable full-wake-history
// 电池数据重置
adb shell dumpsys batterystats --reset
// 生成电量数据到文件,此命令会持续记录输出,停止记录Ctrl+C
adb bugreport > bugreport.txt
上传文件分析
执行命令:
go run cmd/battery-historian/battery-historian.go
打开浏览器:http://localhost:9999/
上传 bugreport.txt
优化策略
通过统计信息可以看出耗电主要发生在屏幕、网络相关、GPS定位。
1.网络请求
首先App会有大量的网络请求是不可避免的,手机内置的radio(射频模块)无时不刻处在活跃状态,应用大量耗电情况对于一直连着USB测试的开发者,感官上并没有多大的体会,但对于用户来说电量损耗也是体验的一方面。
对网络请求优化之后说,现在说说请求之外要做的一些事情
1.1.合理合并请求,减少请求次数
减少网络获取的频次就减少了Radio活跃时间,从而减少radio的电量消耗。
对App与Server之间的API要注意请求频次和资源状态,尽量让App用较少的请求完成业务,在实际开发中接口的单一职责并不十分适合客户端的需求。
1.2.非重要操作集中发送请求
分析,统计,更新下载之类的非重要操作,可以再在充电或Wifi状态下请求
//监听电池充电,持续广播无需receiver
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, filter);
//几种充电方式:
int chargePlug = batteryStatus.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1);
//USB充电
boolean usbCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_USB);
//直流充电
boolean acCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_AC);
//无线充电
boolean wirelessCharge = false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
wirelessCharge = (chargePlug == BatteryManager.BATTERY_PLUGGED_WIRELESS);
}
监听充电状态变化
<receiver android:name=".XXXXXXXReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
</intent-filter>
</receiver>
有个东西叫JobScheduler,Android P对它作出了更好地优化。
1.3.设置超时时间,减少网络消耗
现在的网络框架都具备的功能
1.4.避免无网状态下的网络请求
网络请求失败之后的重试机制,在无网状态下重试只会消耗电量。
2.及时释放WakeLock
有些时候我们需要CPU保持“清醒”状态来确保一些代码的运行,及时release()释放锁,让CPU进入休眠状态来节省电量。
可以给WakeLock设置超时时间,避免出现异常没有及时释放锁。
3.GPS定位
3.1.不同类型的应用场景区分使用不同的定位方式
- GPS定位:精度高 耗电大;室内基本没用。
- 网络定位:通过移动通信的基站信号差异来计算出手机所在的 位置,精度比GPS差,通常误差在几百米内
- 被动定位:当其他应用使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取就可以了
3.2.及时注销定位监听
获取定位后及时注销监听定位,避免监听执行no-op(无操作指令),虽然不被用户感知但却在耗电。
locationManager.removeUpdates(locationListener);
3.3.定位信息复用,节省电量消耗
4.其他
4.1.减少布局层次
减少布局层次避免过度绘制
界面是有一定刷新频率的,每一次刷新都会调用View的onDrow()方法,图形运算会对CPU的耗电量有很大的影响。
UI性能优化
网友评论