Android 电量优化小结

2018-09-05  本文已影响0人  吃茶泡饭丶

使用电量分析工具

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.不同类型的应用场景区分使用不同的定位方式
3.2.及时注销定位监听

获取定位后及时注销监听定位,避免监听执行no-op(无操作指令),虽然不被用户感知但却在耗电。

locationManager.removeUpdates(locationListener);
3.3.定位信息复用,节省电量消耗

4.其他

4.1.减少布局层次

减少布局层次避免过度绘制

界面是有一定刷新频率的,每一次刷新都会调用View的onDrow()方法,图形运算会对CPU的耗电量有很大的影响。

UI性能优化

上一篇下一篇

猜你喜欢

热点阅读