通过battery-historian分析wakelock对CPU和电池续航能力的影响

Android为了节省电量,会在用户无操作一段时间之后进入休眠状态。Wake Lock是一种锁的机制,只要有人拿着这个锁,系统就无法进入休眠。一些App为了能在后台持续做事情,就会持有一个WakeLock,那么手机就不会进入休眠状态,App要做的事情能做了,但是也更加耗电。


我使用百度地图android sdk开发了一个app,可以在户外徒步过程中,定位当前的GPS位置。锁屏后会进cpu休眠,定时定位功能失效。为了保证后台的service能够安全的监听GPS信号,按照这个帖子的方案增加了wakelock(帖子地址http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=9660&extra=page%3D1&page=1)。今天找机会测试了一下,将测试后的电池信息通过battery-historian分析,发现长时间持有wakelock,会导致CPU一直忙而耗电。


下面就是battery-historian工具分析后的电池使用情况,图的左侧各行是android各个组件,右侧坐标是battery level电池电量,横坐标就是时间,中间的一条折现就是电池电量随着时间的变化情况。






从早上9点到下午2点50分,一直都打开app,也就是字母为a的区域。这期间userspace wakelock一直都持有,而CPU running也是一直在用,从电池电量的折线可以看到,电池消耗很快。

在下午3点到5点30分左右,关闭app,也就是字母b的区域。这期间userspace wakelock间歇持有,同时CPU running也是间歇在用,从电池电量折线可以看到,电池消耗变得缓慢。


因此需要对wakelock的使用进行优化。

1、App在前台不要申请WakeLock,此时无需申请,申请的话会计算到应用电量消耗;
2、App在后台由于业务需要必须要申请WakeLock时使用带有超时参数的方法,防止由于忘记或者异常情况下没有释放;

PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,TAG);
wl.acquire(TIMEOUT);// 使用带有超时参数的acquire方法
// ... do work...
 wl.release();
3、App申请使用WakeLock,任务结束之后及时释放,让系统再次进入休眠状态。
参考
http://www.jianshu.com/p/5d83d8649c98

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值