安卓系统耗电太快?针对wakelock(唤醒锁)的设置优化教程-程序员宅基地

技术标签: ANDROID  

导读: android为了确保应用程序的正确执行,提供了wakelock(唤醒锁)的api,wakelock是一种锁的机制,只要有应用拿着这个锁,系统就无法进入休眠,手机耗电的问题,其实大部分是这个锁正不正常的问题。

手机上应用程序的耗电,本质上是它所启用的硬件在消耗电量。android手机有两个处理器,即application processor(ap,应用处理器)和baseband processor(bp,基带处理器),另外耗电单元还有gpu、lcd、wifi、gps、bt等,一般手机待机时,ap、lcd、wifi均进入休眠状态,这时应用程序的代码也会停止执行,只会有bp在耗电。

android为了确保应用程序的正确执行,提供了wakelock(唤醒锁)的api,wakelock是一种锁的机制,只要有应用拿着这个锁,系统就无法进入休眠,普通的用户应用和系统内核都可获得。wakelock可以是有超时或没超时的,超时的锁在超时后会自动解锁(有些流氓应用就不断用超时锁然后靠系统自动解锁),当没有锁了内核就会启动休眠机制进入休眠状态。

手机耗电的问题,其实大部分是这个锁正不正常的问题。

为什么会有异常耗电?

经常听到有朋友抱怨,一晚上手机待机耗电超过15%,而且还不知道是什么应用在偷跑,就觉得电量哗哗地就往下直掉。正常情况下一晚上待机耗电在2-3%左右,超过这个值较多的肯定是有问题,绝大部分问题来源于以下几种。

1、霸道的google服务

在国内,如果你的手机安装有google组件,即便是在账户设置里取消同步,google服务还是会在后台同步,如果被墙了,同步就会拿到锁,不断唤醒ap,致使系统完全没法进入休眠状态,消耗相当多的电量。

装了google组件,问题也来了(google服务耗电量第一)

如果再看到有"耗电最多的是谷歌服务怎么办"的问题,你可以把这篇文章推荐给他看看,下面会有解决方法。

2、频繁唤醒ap的各类app

早在2012年,google就发布了gcm(google cloud messaging),gcm提供了在应用服务器和android设备之间引入代理的能力,以保障两者之间可伸缩的云通信。使用gcm推送服务的应用即使后台程序和服务都关闭掉,也依然可以在第一时间接收到新消息的推送。

但是由于众所周知的原因,国内行货android手机都阉割了google服务,也就无法使用google的gcm push通道,原本每个手机中只需要建立的唯一共享的push通道,也就变成了各自为政。每一个声称为用户提供实时通知的国内app(如通讯类、天气日历类应用),为了自身程序在后台的正常工作 ,让用户能"及时"接收到推送的消息必然使用自己的推送服务,可能会频繁的唤醒ap阻止其进入休眠。

手机qq2012是曾经有名的电老虎

以微信为例,微信android版是以5分钟为周期发送心跳连接,这相当于每天发送近300条短信的消耗,每天手机会有300次从待机省电状态被唤醒。而google的gcm心跳周期为28分钟,尽可能降低心跳频率从而节省耗电。这仅仅是微信,其它相似的应用也做着同样的事情。

滴滴打车也是电老虎(betterbatterystats的监测,后面会讲到)

其实微信这样的消息推送还算正常,上图中,像qq、微信、微博的心跳周期差不多都是5分钟,也就是每小时唤醒ap 12次左右,但是看看排第一的滴滴打车,每小次居然唤醒次数高达33次,心跳周期估计是100秒,这也就是为什么很多人说滴滴打车耗电厉害的原因。另外还有许多android应用获取消息的方式是轮询(而非推送),即应用主动地与服务器连接并查询是否有新消息,可想而知它对系统和网络资源的消耗。

在android系统上,开着十几个超时锁长连接的壮观场面经常可见,大有你流氓我更流氓的意思,手机的耗电想正常也不可能了。除了google服务外,国内各类强占wakelock的流氓app也是手机电池杀手。

3、系统(rom)优化不够

现在各家手机都有自己的系统,不光是ui风格各异,对android底层的修改也是随心所欲,如果修改得不好的甚至会变成"反优化",系统卡顿、耗电增加似乎成为司空见惯的问题。

联想vibe shot的电量使用情况,堪称反面教材

这里拿联想vibe shot作个反面例子,同事一直在用这款手机,也一直吐槽手机耗电问题,简单看下它的电量消耗情况,上图中显示"联想日历"耗电占了14.9%,同事称根本没用过这个日历,该应用cpu使用时间近一小时,这还是系统自带的官方应用,情何以堪。再看看微信的情况,更是糟糕,上面说过,微信心跳连接周期为5分钟,也就是说在1天6小时内唤醒次数为360次左右,但是在联想vibe shot,唤醒次数居然高达2110次,使得微信的耗电量狂增,不得不说联想确实要好好把自己的vibeui化下。

另外典型的例子就是很多手机有官方rom与cm版rom,很多时候cm版rom能提供更加丝滑般的顺畅,但是耗电却不减反增,或许是cm版rom在驱动方面优化不足,关于这个问题,打算日后会来篇《为什么cm rom更耗电?》讨论讨论。

初步解决方法:绿色守护--谁耍流氓干掉谁

在"设置-电池"中查看耗电情况

一般来说,如果觉得耗电过快,可先在手机"设置-电池"查看具体的耗电情况,对于一些异常的应用耗电可以采取卸载、冻结的方式来看看是不是它在作崇,只不过不同的rom,它显示的方式并不一样,像一些系统应用都统归于"android操作系统"这一项(如google服务),所以这个只能参考下,只是初步目测而已。

说了这么多,转到重点上来,也就是今天要隆重推荐的耗电杀手级应用--绿色守护(greenify)。

android神器之绿色守护(2.7 beta4)

绿色守护作为android神器,其实早已声名远播,它主要能对付那些申请了锁却没有学会释放的应用程序,通过独特的"绿色化"技术,来减少电池消耗,目前最新版本为2.70。从2.0版本开始,绿色守护可以在工作在非root模式,不过这一机制由于权限制约,还是没法实现自动休眠,所以强烈建议手机获取root权限, 获取root权限其实也不会增加什么风险,这里要表扬下小米和魅族这些直接在rom中开放了root权限的厂商,极大方便了玩家。

点击右上角的"+"添加需要绿色化的应用

绿色守护使用起来很简单,添加需要绿色化的应用即可,这些被添加的应用在屏幕关闭三分钟后进入休眠状态,从而达到省电的目的。但是不要绿色化闹钟、即时通讯、启动器类的应用,除非你确定不使用它们,而像google服务这样的,也可以选择无视状态强制让它进入休眠,但不得不说即使如此有时候google服务还是会在后台运行。

绿色守护另外还有功能更强大的捐赠版,需要xposed框架配合使用:

xposed框架下的绿色守护,功能大大加强

捐赠版能绿色化系统应用、深度休眠等,而且可以让gcm推送唤醒绿色化的应用(像gcm版微信、淘宝都可以被绿色化),这些支持gcm推送的应用在绿色守护中会有个小图标显示。

只要几步简单的操作,凡是耍流氓的应用都可以被"干掉",在熄屏后还不断唤醒ap的的情况可大大缓解。

进阶之一:寻找真凶的betterbatterystats

绿色守护是一副良药,但也不是包治万病,有时还需要对症下药方能根冶,这就是需要我们能找到耗电的真正元凶,要借助一些手机电池工具app来帮忙。目前比较好用的电池分析工具有wakelock detector和betterbatterystats这两款,前者久未更新,也不支持android 5.x的系统,所以不作推荐,betterbatterystats(简称bbs)目前最新版本为2.0,功能强大,操作简单,值得一试。

bbs是一款实用的电池工具,能够分析你的手机行为,找到那些造成手机耗尽电池的应用,需要注意的是在安装完后选择作为系统应用安装,然后重启手机才能正常运行。

bbs能监测的项目

bbs能监控多个项目,如果待机一段时间,在"other"项目中"deep sleep(深度睡眠)"没达到90%以上,那就要好好考察考察。需要重点关注的是"partial wakelocks"、"alarms"、"cpu states"这几个项目,而像"network"能监测到各个应用的流量消耗情况,这样偷跑流量的应用就很容易被揪出来。

"partial wakelocks"与"cpu states"

partial wakelock是锁的一种,它表示保持ap运行但屏幕和键盘灯有可能是关闭的,也就是熄屏后偷偷在运行的那种,真凶在这儿往往能现形,像上图的"checkin service"在66分钟监测时间内运行了27分钟,明显就是耗电大户。cpu states能显示在监测期间手机cpu工作频率的分布情况,如果待机时"deep sleep"占比不高同样说明有应用在默默地奉献。在"alarms"中可以监测到各个应用的唤醒频率,这样也容易找出那些心跳过快的app。

bbs能够比较容易找到不正常耗电的真凶,接下来的事就是要处罚这些真凶--杀无赦或关进牢里。对于一些普通的无良应用可以直接杀无赦卸载了事,但像google组件这样的, 有时卸载并不是个很好的方法(有些应用需要google服务支持,这时卸载并不能适用所有状况),冻结也就是把它关起来不给它活动是最简单的方式。

进阶之二:冻结害群之马

把应用冻结起来的方法很多,相关的app不少,像xx卫士什么的都能做到,不过这里推荐使用钛备份(titanium backup),钛备份是android手机玩家必备应用之一,除了常规备份外,它也支持冻结(解冻)应用,目前最新版本为7.2.1。

钛备份的冻结功能

在钛备份中,点击任何应用(包括系统应用),都可以弹出一个功能窗口,包括备份、冻结和卸载等,被冻结的应用会有蓝紫色背景显示,再次点击它们,可以进行解冻。

对于国内手机中的google服务,建议还是冻结起来为上策,绿色守护有时也难以控制住它,需要用到时再解冻。

进阶之三:借力android第一神器xposed框架

玩机的朋友,一定会听说过xposed framework,如果它说是神器第二,没人敢说是第一。xposed框架是一款可以在不修改apk的情况下影响程序运行的框架服务,基于它可以制作出许多功能强大的模块,且不占用任何资源。xposed更像一个平台,提供了由众多作者编写的数千个模块,这些模块或大或小,主要实现功能增强、修复bug、美化系统等作用。

最新的xposed 3.0 alpha4版本

目前xposed能很好地在android 5.x系统上运行,最新版本为xposed 3.0 alpha4,在android 5.x系统中安装时除了app外还需要通过recovery刷入相应的框架(并且区分5.0.x和5.1.x两个框架),有一定的门槛,不过对于玩机的朋友来说这都不是个事。在android 4.x系统中,最新的版本是xposed 2.7,直接安装即可。

有个问题是,很多手机自带rom(如miui、flyme等)定制化严重,对xposed的兼容性并不好,有时可能要选择一些低级的版本或特制版本才能正常工作 ,像华为的emui只能使用xposed 2.5.1版本,版本过低这样很多功能模块就无法使用。

xposed中的模块及下载

在xposed的下载中提供了数千个模块供免费下载(少数模块会有需捐赠的高级版),像前面介绍过的绿色守护捐赠版,它能提供更好的绿化功能,也有pre app hacking这样的模块来防止wakelock,也有native freezer来冻结应用,基本上你需要的功能在xposed框架中都可以找到。

小结:

待机了12小时还是100%电量,怎么破?

目前无论是android手机还是iphone,续航都是个老大难的问题,既然电池已经固定不可更改了,那么内部挖潜降低手机耗电量是唯一出路,国内手机中,耗电影响比较大的一是google服务,一是那些申请了锁但又舍不得释放的应用,通过绿色守护能缓解它们的影响,更激进一点的策略就是冻结或卸载它们,一劳永逸。这些简单的操作,至少能让你手机的续航提高一个档次, 更主要的是能获是玩机的一些乐趣,何乐不为呢。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rongwenbin/article/details/49489391

智能推荐

UAV无人机(一):概述-程序员宅基地

文章浏览阅读1.2k次。UAV在各个领域有广泛的应用,比如:航拍摄影、农业和林业监测、环境监测、灾害救援、边境巡逻、科学研究、物流配送等。随着技术的不断进步,无人机的应用领域将不断扩展,为人们的生活和工作带来更多便利和创新。无人机通常由飞行平台、控制系统和载荷组成。垂直起降无人机(VTOL):垂直起降无人机具备垂直起降和水平飞行的能力,结合了多旋翼和固定翼的特点。四旋翼无人机:四旋翼无人机是一种常见的多旋翼无人机类型,具有四个对称排列的旋翼。它们具有简单的结构和灵活的操控性,适用于各种短距离任务,如航拍、物流配送、巡逻等。_uav无人机

【星计划★C语言】c语言初相识:探索编程之路-程序员宅基地

文章浏览阅读3.4k次,点赞93次,收藏76次。本文主要初始c语言,简单讲解了一下使用于考研的c相关的数据类型。

vue组件provide和inject传值_provide和inject 兄弟传值-程序员宅基地

文章浏览阅读691次。provide放在父组件的,inject是放在子组件的,如果是爷孙之间传值,必须在子孙组件之间引入,才能让孙组件获取爷组件的值,兄弟之间传值建议利用事件总线的方法传值。注意点是他只能后代传值,兄弟之间是不可传值的,..._provide和inject 兄弟传值

java书面_Java程序猿的书面采访String3-程序员宅基地

文章浏览阅读88次。public class SameString {//思想二:每个字符都相应着自己的ASC码,第一个思想的算法复杂度为O(nlogn)。一般能够利用空间来减少时间复杂度//能够开辟一个大小为256的数组空间,而且将256个数组元素都置为0,然后遍历第一个字符串把字符的ASC作为数组下标。数组元素都加1,//然后遍历第二个字符串将数组元素的各个值都减1,假设最后数组元素的值为0的话说明就是同样的字符..._java程序员访谈

Python-类与类之间的相互调用_python中一个类怎么调用另一个类的方法-程序员宅基地

文章浏览阅读8.2k次,点赞5次,收藏30次。python语法当中,类与类之间的相互调用_python中一个类怎么调用另一个类的方法

Spring 中使用Mybatis,超详细_spring mybatis-程序员宅基地

文章浏览阅读1.2k次。本文详图讲述了在Spring中使用Mybats的步骤和方法。_spring mybatis

随便推点

林子雨《大数据技术原理与应用》第五讲——NoSQL数据库_请描述作为nosql数据库的基石之一的base的含义-程序员宅基地

文章浏览阅读1.1k次。NoSQL数据库林子雨《大数据技术原理与应用》第五讲笔记NoSQL数据库特点灵活的可扩展性灵活的数据模型和云计算结合查询性能差未形成通用的行业标准维护更加复杂NoSQL数据库有四大类型键值数据库:redis列族数据库:HBase、Cassandra文档数据库:MongoDB图数据库:Neo4j键值数据库数据模型:键是一个字符串对象,值可以是任意类型的对象典..._请描述作为nosql数据库的基石之一的base的含义

wps在线预览接口_WPS录屏、录制在线课程、PPT一气呵成-程序员宅基地

文章浏览阅读1.9k次。受到疫情影响,近期教师、学生都在使用了在线学习,教师在线直播、在线录课成为了近期的教学的必备手段,开始远程学习和远程办公成为近期的教学方式,WPS作为国产办公软件的龙头,自然有许多远程办公的工具,WPS录屏就是法宝之一。WPS录屏又称“屏幕录制”,功能齐全操作简便,非常适合教学演示录制、会议演示录制、制作视频教程和产品宣传片等场景。1、在WPS上怎样实现屏幕录制?答:打开文档/表格/PP..._wps微课录制插件

数据分析-程序员宅基地

文章浏览阅读1k次,点赞16次,收藏8次。数据通常来自于企业内部或外部,企业内部数据可以直接从系统获得,外部数据则需要购买,或者通过爬虫等数据采集工具采集;: 获取到的数据往往会包含一些干扰数据、不完整数据,因此一般需要对数据做相应的处理;: 不同的业务对数据的需求不同,根据相关业务或战略需求建立相应的数据模型,有针对性进行主题分析;: 根据模型中要分析或计算的指标,采用相应的分析方法进行数据分析,得出目标分析结果;: 将数据分析结果进行可视化展示,使其更加方便业务人员或决策者理解数据的来源主要分为两大类,企业。

一文掌握:服务器渲染的web开发搭建以及运行(html nodejs cors express)_node 服务端渲染-程序员宅基地

文章浏览阅读310次。毕业设计 mysql nodejs cors express html router _node 服务端渲染

文件系统_文件系统要维护的信息包括-程序员宅基地

文章浏览阅读691次。计算机的文件是一种存储和组织计算机数据的方法,是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型。设备文件设备文件与系统的某个设备相对应。在内核中,每种设备文件都有与之相对应的设备驱动程序,用来处理设备的所有I/O请求。设备划分为两类:字符型设备基于每个字符处理数据。终端和键盘块设备每次处理一块设备。块的大小取决于设备类型。磁盘和磁带设备。磁盘和分区常规文件和目录通常放在硬盘设备_文件系统要维护的信息包括

Solr router 路由介绍_router:implicit-程序员宅基地

文章浏览阅读1k次。目录1、compositeId路由1.1、compositeId路由原理1.2、compositeId路由查询2、implicit路由2.1、implicit路由原理2.2、implicit路由查询3、扩展3.1、compositeId路由方式扩展3.2、implicit路由方式扩张solrcloud的官方文档有对路由的简短介绍,但是不够详细和深入。solr..._router:implicit

推荐文章

热门文章

相关标签