查看耗电
手机 设置——耗电排行
注册广播:intent.setAction(Intent.ACTION_BATTERY_CHANGED);获取电池电量,充电状态,电池状态等信息;
这是针对手机整体的耗电量,而非特定app,故价值不大
battery historisn:Google推出的一款android系统电量分析工具,支持5.0以上
安装Docker
安装battery historisn:docker -- run -p<port>:9999 gcr.io/android-battery-historian/stable:3.0 --port 9999
导出电量信息:
adb shell dumpsys batterystats --reset 重置信息
adb shell dumpsys batterystats --enable full-wake-history 开始记录
adb bugreport bugreport.zip 导出
上传分析:
http://localhost:9999 或 https://bathist.ef.lc
基本套路总结:
CPU时间片:如果app导致cpu一直处于工作状态,无疑非常耗电,通过traceView或者CPU profile工具来获取app运行中的cpu信息,定位cpu占有异常的方法;同时减少后台应用的主动运行。
网络相关:控制发起网络请求的时机以及次数,在发起请求的时候要区分这个请求是否紧急、是否可以延迟,可以延迟的请求可以针对性地绑定到一起发送,这样可以减少网络被激活的时间和次数,而数据处理可以在传输之前进行压缩,这样网络传输的时间也会降低,且节约流量,最后,一定要禁止使用轮询的方式去做业务操作,轮询导致网络一直处于激活的状态。
定位相关:根据场景谨慎选择定位模式,在一些对精准度要求没那么高的场景下,可以使用低精度的模式,甚至考虑网络定位来代替GPS,如使用GPS,使用后务必及时关闭,减少更新频率
界面相关:离开界面后停止相关活动(动画等),如果处于后台,就不执行相关耗电操作
WakeLock:
JobScheduler(JobService):在符合某些条件时创建执行在后台的任务;把不紧急的任务放到更合适的时机批量处理
怎么做电量测试:电量相关的测试要相对难做一些,因为app在具体用户设备上的耗电量无法统计,每一个设备使用的硬件不一样,那么相关的功耗也就不一样。拿不到相对精确的值,我们就只能尽可能地增加多维的监控来辅助判断该app是否耗电。关于电量测试,我们可以分场景逐个突破,详细地说就是按照app的功能进行针对性的专项测试,利用手机设置里的电量统计功能作为判断的依据,操作某个功能一段时间之后,到设置里面去看电量消耗了多少,这样的方案相对直观一些,但是不那么精确。还可以采取battery historisn,这是Google推出的一款android系统电量分析工具,支持5.0以上,这个工具拿到的电量分析要相对精确一些,且更加丰富,我们可以通过它详细地获取到耗电组件,比如说GPS、蓝牙等的工作时间以及耗电量,它可以对单个app进行选择,也可以比对不同的电量日志信息,比如说优化前和优化后的详细信息,但是也只能在线下使用。因此在线下测试后需要加上一些线上的辅助监控,比如说耗电组件的使用次数,调用堆栈以及访问时间,这些也是用户线上相关的电量数据,如果有用户线上反馈的话,我们就可以通过这些信息来判断用户是不是有耗电的操作。
有哪些有效的电量优化手段:
因为我们不能精确地拿到线上的电量消耗,因此需要尽可能保证app在正常情况下不耗电,需要在线下优化好电量,对于网络请求我们要控制发起请求的时机和次数,将可以延迟的网络请求批量发送,减少网络被激活的时间和次数,压缩数据,减少发送时间,节约流量,同时禁止使用轮询的方式来做业务操作。对于传感器相关的操作,要谨慎选择合适的模式。基本这样做,就会比竞品少耗电了。