文档开发者中心
我的

手机耗电问题,大部分是没有正确使用这个“锁”

当安卓设备闲置时,设备很快会进入休眠状态,以达到省电和减少CPU占用的目的。但有些应用在手机灭屏甚至系统休眠时,依然频繁占用CPU处理事件或唤醒屏幕提示用户消息,这类行为会导致手机耗电加速。那么,应用这种行为究竟是怎么实现的呢?那就是安卓中的WakeLock机制。

本文以“今日头条”、“腾讯新闻”、“天天快报”等10款新闻类应用为例,分析WakeLock在应用中使用情况。


Wakelock简介

Wakelock是安卓提供的唤醒锁机制,是阻止系统进入休眠,让系统保持“清醒”的一种手段,应用可以用它来保持CPU唤醒(局部唤醒锁),保持、开关屏幕,普通的用户应用和系统内核都可获得。例如:在使用一些新闻类产品,如有消息进来,手机屏幕即使在锁屏状态下也会亮起并提示声音,这时用户就知道有新消息了,这时候用到的就是Wakelock唤醒锁机制。

Wakelock作用

当手机灭屏状态下保持一段时间后,系统会进入休眠,一些后台运行的任务就可能无法正常执行,如网络下载中断、后台播放音乐暂停等,而WakeLock正好解决这类问题。应用只要申请了WakeLock,那么在释放WakeLock之前,系统不会进入休眠,即使在灭屏的状态下,应用要执行的任务依旧不会被系统打断。

Wakelock使用时机

如断线重连、重新登录这些关键逻辑的执行过程,一旦执行成功就应立即释放wakelock。

常用的WakeLock级别

PARTIAL_WAKE_LOCK是应用常使用的类型,应用在后台持锁耗电且用户并没有直观的感知。通过功耗仪查看应用持锁和释放的电量的趋势如图:

创建和保持唤醒锁定会对主机设备的电池寿命产生巨大影响,后台运行对CPU计算频率相对较低,但是所耗资源依然远比休眠耗用的电量大,因此只有在严格必要时才应使用唤醒锁,并尽可能短地保持它们。

Wakelock评测

测试方案

本次评测采用DevEco检测方案,通过检测应用在灭屏1小时内后台对wakelock占用来衡量应用是否存在不合理使用wakelock的情况。

测试方法:

  1. 将应用安装,启动正常操作几分钟后,放置后台,灭屏;

  2. 获取Bugreport文件:通过分析Bugreport(参考Battery Historian的搭建),统计里面的wakelock时长进行判断。

测试对象

测试结果


测试结果显示pp体育和淘新闻在后台测试时间内持续持锁没有释放。今日头条、腾讯新闻、天天快报、网易新闻、凤凰新闻、趣头条、新浪新闻和东方头条都满足绿盟对wakelock定义的 标准5min/h表现良好。

异常分析:

pp体育具体持锁信息如下图所示:


持锁信息中可以看到PP体育有两个服务持续持锁,初步定位是投屏服务和记步服务,PP体育测试前的遍历也没有遍历到记步和视频投屏相关场景,建议使用相关功能在开启相关服务。

淘新闻具体持锁信息如下图所示:


上图可以看到,com.coohua.stepcounter.TodayStepService是后台持锁的根本原因,且对应的模式是后台持锁只持CPU并不点亮屏幕,从服务的命令上可以初步判断是记步服务。淘新闻测试前的遍历并没有遍历到记步相关功能,记步服务存在不具备较强的合理性,建议使用相关功能在开启相关服务。

* 华为终端开放实验室已经与淘新闻团队取得联系,淘新闻表示将在5个工作日内调整解决。

通过配置文件查看,发现淘新闻和PP体育具有相同的特点,即服务优先级最高以及捕获到电量变化均会触发持锁服务,会导致手机无法进入休眠状态,影响待机时长。

优化建议

  1. 当应用放置在后台时,如果不是业务所需,尽量不要申请WakeLock;

  2. 因为业务需要申请WakeLock时,请携带参数超时释放或者做相关逻辑及时释放,让系统再次进入休眠状态;

  3. 如果应用依赖于后台服务,请考虑使用 JobScheduler或 Firebase CloudMessaging以特定时间间隔触发这些服务。


点赞
2
收藏
3
回复
4
分享
举报
浏览4725 编辑于2019-12-03 07:40未知归属地
全部评论
最多点赞
最新发布
最早发布

收藏!实用!

3楼回复于2019-07-29 01:41 未知归属地

好文,很好的建议

2楼回复于2019-07-27 07:39 未知归属地
很好的建议
回复于2019-07-18 07:20 未知归属地

沙发,顶一个

1楼回复于2019-07-18 07:20 未知归属地
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

了解社区公约,与您携手共创和谐专业的开发者社区。