相信我派的读者里一定有从 iOS 转向 Android 的用户。不知你最大的感受是不是「卧槽我就把手机放那儿啥都没干怎么就没电了啊啊啊……」这情况对于使用接近原生 ROM 的读者一定似曾相识。这时候你如果以「Android 省电」为关键词进行搜索,搜索到的大致是这些内容:

  • 适时关闭 WiFi、数据流量、GPS 等服务
  • 在设置-WiFi-高级设置-在休眠状态下保持WiFi网络连接
  • 使用静态壁纸代替动态壁纸并减少桌面小插件
  • 缩短锁屏超时时间
  • 关闭账户同步
  • 关闭系统自带的音效,如 Viper4Android, MaxxAudio, 调调等
  • 关闭触摸提示音

没错,市面上玲琅满目的省电软件做的也就是这些工作。虽然这些操作确实能够起到一定的作用,可是还是无法达到 iOS 上令人踏实自信的续航表现。相信大家看到这里就都明白了。在这一切的背后,有一只讨厌的「蛀虫」在侵蚀着手机的电池。而它,就是 WakeLock。

什么是 WakeLock

在没有 WakeLock 的时候,锁屏的 Android 设备将会自动进入一个低功耗状态。而WakeLock 就是手机深度睡眠时,由应用申请的一种锁定设备并阻止它睡眠的机制。它本身并不是一个大问题,但是有些国内应用并没有进行特别的优化,也不支持系统原生的对齐唤醒。一两个应用以适度的频率获取 WakeLock 并不会对手机电量造成迅猛的影响,但如果你的手机上带着一堆这样的应用——也许你的手机根本「睡」不着。这就像一个人(暂且称为「傻蛋」好了),在刚睡着的时候被大傻叫起来说了一句话,说完之后刚躺下二傻又上来说一句话;还有更过分的情况——三傻在跟傻蛋说完事之后,赖在傻蛋面前不走了,不!让!傻!蛋!睡!觉!

那么,我们来说说 iOS 与 Android 的后台机制。

iOS 的后台机制与允许应用开机自动启动并常驻后台的 Android 不同,iOS 上的第三方应用不允许开机自启,后台运行上也限制多多,只有在少数情况下才能被系统「网开一面」,能够后台运行和自启。而 iOS 在推送服务上采用了 APNS(Apple Push Notification Service) 的解决方案,即系统仅拉起一个进程与苹果服务器通讯来实现推送,这样就能保证电池、流量的最大化利用。当然,世间并无完美之物。由于推送信息来自系统服务,而非应用本身;因此点击推送进入应用时,它就需要从网络再次拉取信息,造成了一定的时间落差。

Android 上虽然有与之类似的 GCM(Google Cloud Messaging),但受限于国内特殊的网络环境和 Android 设备的碎片化,GCM 在国内应用中并未广泛使用。这就造成了一个问题:没有统一的推送接口,唤醒无法对齐,推送效率大大下降。如果应用使用的是「老大哥」们的 SDK,则它们在启动时,大多数会连带唤醒这台设备上所有带此 SDK 应用的对应 Service——这就让手机更无法安眠了。

除此之外,Android 应用还需要和「管家」类应用斗智斗勇。为此,它们注册了无数个 Service 和 Reciver,这确保了它们在被系统或「管家」类应用杀掉之后能够快速地重启。这种「猫捉老鼠」的游戏在某些情况下甚至给你的手机带来了更大的负担。和上述严峻问题并存的,还有一个耗电大户—— Google Play Services. 它造成的问题是多方面的:有频繁获取地理位置、由于网络问题的频繁重试,甚至还有由于 Google 迷糊造成的 Bug. 由于篇幅限制,在这里我就不一一赘述了。

花开两朵,各表一枝。到底要怎么解决这些令人厌烦的电池浪费者呢?

善用自带功能

对于正在使用 MIUI 等国产 ROM 的读者来说,此篇文章所描述的 WakeLock 带来的问题也许不是困扰你的最主要原因。众多的国产 ROM 大多自带后台自启控制和对齐唤醒,你只要善用这些功能就够了。诸如 ColorOS 的纯净后台、MIUI 的对齐唤醒与一刀切的后台管理与新版本中的「神隐模式」,都是你的不二选择。抛开这些优秀的省电策略不说,本文中介绍的一些应用与系统自带的省电策略配合使用的情况下效果并不是那么理想。 

找出罪魁祸首

经过前面一大段的理论洗礼,相信读者已经很清楚 WakeLock 是什么与它的危害了。WakeLock 对普通用户来说神龙见首不见尾,我们怎样才能控制它呢?我将呈上两种方法供君任选。

第一种方法很简单,它就藏在你的眼皮底下:设置中的电池栏目。在这里,系统列出了每一个它认为耗电的软件,你可以在详情中看到,你还可以点击上头的图标来查看唤醒与亮屏的对应关系。

当然,这种方式的缺点也是显而易见的:你无法查看 WakeLock 由哪个程序的哪个服务发出,也无法查看那些系统认为耗电较低的程序。这个时候我们就要祭出大杀器——BetterBatteryStats(以下简称为 BBS)。

如果你的 Android 版本是 4.4 或以上,那么它的安装显得有一些繁琐:先安装应用,授予应用 root 权限后,点击 Install 并重启,之后再从网上下载主程序并安装。有点绕对吗?总之,你需要两次安装从网络上下载的安装包。打开 BBS 之后,你将会被自动定位到 Other 板块。在这里你可以看到几种系统状态的时间和对应的占比,比如开屏时间、保持唤醒的时间和 WiFi 开启的时间等。当然,BBS 可以做的事情不止这些。对于我们来说,最重要的就是Partical Wakelocks 与 Kernel Wakelock 板块了。

在 Partical Wakelocks 里,我们可以看到是哪个应用的哪个服务拿到了 Wakelock 锁,及其时间、次数。而 Kernel Wakelock 里的有些内容则属于「玄学」的范畴。最常见的是 PowerManagerService.WakeLocks 和 PowerManagerService.Display, 分别代表着 Partical Wakelocks 里全部内容的总和及你的亮屏时间。其中,event*-*** 这一类的 WakeLock 大多数是系统本身获取的,在正常情况下并不会太多。如果你发现这些 WakeLock 有较大比重,那你可能要考虑双清或重刷 Rom(我曾经跟这个幽灵 WakeLock 斗争了一周,终究败下阵来)。

至于其他的 Kernel WakeLock 如果占了较大比重,我建议也进行双清或重刷,因为跟这些古怪的 WakeLock 斗争的时间性价比实在太低。当然,如果你自带了高冷傲娇属性,并且有一定的英文基础,那么上 xda-developers 搜索也许会找到令你满意的内容。

以点打面

现在,我们要正式开始同 WakeLock 周旋了。

首先,如果你使用的是 CM 系统,那么系统内置的「隐私防护」功能就是很好的一把武器。以关闭 Google Play 服务的唤醒权限为例:进入设置 - 隐私 - 隐私防护 - 右上角三点 - 高级,找到 Google Play 服务,滑到底端,将「唤醒」和「保持唤醒状态」的开关关闭就可以了。当然,你也可以在这里定制软件的其他权限,甚至可以启用「默认启用隐私防护」功能,对你的隐私进行保护。

我通常将这个功能与下面即将提到的绿色守护一起使用,填补了绿色守护免费版不能绿色化系统应用的坑。那么,如果不是 CM 系系统怎么办呢?别急,在 Android 4.3 以上的系统中,应用权限选项一直都在,只是需要一些小动作才能打开,譬如我们可以用之前提到的 BetterBatteryStats。进入 BBS 的 Partical Wakelocks 版块,随意点击一个其中的应用图标,然后选择 App Ops,就可以调出系统内置的隐私防护界面了。

不过这个方法不适用于一些修改过的系统(比如目前的夜版 CM 就是不支持的),这时候你还可以用 AppOpsXposed 或 App Ops 4.3 / 4.4 KitKat 来开启或新安装权限管理模块。除了安装之外,步骤整体上大同小异,在此就不再赘述了。

除了以上几个「粗暴」的限制方法,还有一个更温柔的方法:Amplify。它使用一种更保守的方式来限制 WakeLock:限制 WakeLock 运行的间隔。应用在默认的模式下将会自动分析并限制 WakeLock 和 Alarm, 整个过程并不需要人工干预。虽然方便,可它的智能算法有时并不能有效地识别出需要被限制的 WakeLock,这时候如果你想人工调校的话,就需要购买捐赠版。

以面打点

除了这些,还有没有更简单的方法呢?今天的重头戏要登场了!

首先,我们要介绍的就是被誉为 Android 平台省电的「瑞士军刀」——绿色守护。相信这个名字大家都耳熟能详,在 Android 上,它就像一个轻巧的「内存清洁工」,在你的手机里清理着那些你不需要常驻后台的软件,并且防止它们被清理之后「诈尸」。

绿色守护的使用很简单,你只需要在设备 root 好之后,安装 Xposed 框架,然后在绿色守护中选取需要绿化的应用即可。除了你必须要收到推送(如 QQ、微信等)或需要常驻后台的(如输入法、闹钟等)应用之外,都可以放心地加入绿色守护中。它同时也是智能的,在侦测到应用正在被使用(如部分视频软件在缓存视频、音乐软件播放音乐)时将不对应用做自动休眠动作。

但简单地绿色化应用是远远不够的。前文中我们提到过,国内的应用还注册了大量的 Reciver 来防止自己被「斩草除根」。默认情况下,绿色守护出于应用完整性的考虑,并没有完全切断这种动作。这时候,我们就要手动剪掉哪些无用的 Reciver。在绿色守护主界面中,如果应用是被其他软件连带唤醒的,下方就会有一行「xx:xx 前被 xxx 唤醒」的文字。这个时候,你只需要选中这个应用,再点击右上角的小剪刀就能剪除这个「祸患」。但是要注意的是,不是所有的唤醒路径都能被剪断,有些在剪断之后会造成不可预料的后果。

为了解决需要手动剪断唤醒路径的问题,绿色守护在新版中秉承万物基于 MIUI 的理念加入了强制对齐唤醒的「深度休眠」选项,它使用了更为激进的休眠策略,可以更有效地防止应用被其他应用唤醒(这位先生不要走远了啊这里不是 MIUI 发布会!)。除此之外,绿色守护与 Xposed 还擦出了许多火花,还要看官们自己去发掘其中的妙处了。然而,我并不推荐打开实验性特性中的「让绿色化应用响应通讯事件」,因为国内某厂毒瘤应用注册了全套的通讯事件,打个电话你就会听到一连串叮当猫的提示音了…… 

如果你不愿意装 Xposed 框架的话,那么还有一个「瑞士军刀」供君选用:360 卫士极客版。360 安全卫士极客版的超强模式几乎包括了全部绿色守护的功能,但也带上了浓浓的国内软件色彩:替用户思考,而不是列出事件让用户自己思考。除此之外,360 卫士极客版的休眠效率和「防诈尸」功能也做得很棒,内置的流量管理也体验不俗。鉴于我派里已经有十分详尽的教程文,我在这里就不多说啦,大家可以移步末尾的「拓展阅读」来查看。

结语

Android 的每一次大版本进化都对省电策略有了各种改进,如今它在续航方面的表现已经令人基本满意,然而却没有做到令人惊叹的地步。对于原生爱好者来说,「训猴」所付出的时间和精力大把大把。国内高度定制的 ROM 也许已经令人大体满意,却总有一些乱七八糟的问题(我就很讨厌 ColorOS 纯净后台会将后台应用彻底挂起的设计,MX5 也爆出了不能收到微信信息的 bug),所以说,还是自己调教出来的用起来才放心嘛~


拓展阅读:

Xposed 安装教程: