Android 电量优化小结

使用电量分析工具

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性能优化

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 优化目录 Android 5.0 后用 Battery Historian 工具分析电量。 耗电因...
    三流之路阅读 3,496评论 0 3
  • 文/米格格 不久前,以副处级身份退休的姨妈劝我,去报考社区工作者,这已经是她第三次给我善意的提醒了。 我承认,到居...
    米格格阅读 17,456评论 249 479
  • 真不知道福地有了蚊子,而且还在星级酒店,蚊子也历害呀,咬的我睡不着觉。叮过的地方火辣辣的,奇痒而疼。 叮我的蚊子...
    云水居士阅读 193评论 0 0
  • 这个园子,我叫它百草园。 这里不是鲁迅笔下的百草园,是我工作的一个地方,是我荡心醒脑的乐园。 这里没有...
    z政阅读 694评论 4 1
  • 以我泱泱大国,以德为先,以善为美,千百年来,亘古不变,然古往今来,乃有私欲,贪欲,嗔欲,为所欲为,心性之邪...
    川越大陆阅读 647评论 3 4

友情链接更多精彩内容