安卓4.3之后的位置服务导致的电池问题

前一段AT&T终于推送了4.3,于是就升级了,而之前我还在用4.1——AT&T把4.2直接给跳过了。升级之后系统总体变化不大,但是反而出现一个非常烦人的问题,电池消耗特别快。经过在Xda、Android Central等著名安卓论坛的一番搜索,可以发现4.3之后出现battery drain问题是一个非常常见的现象。而且遇到问题的用户并不局限于HTC,包括nexus 4的官方系统在内都有很多人遇到了此问题。经过一番研究,可以发现罪魁祸首是位置服务。以下是整个问题的详细分析以及(暂时性地)解决方案。

问题原因:网络Location服务唤醒次数过多,导致电池高速消耗。

检测方式:检测wakelock次数,通过Wakelock Detector或BetterBatteryStats可以轻松实现。如果发现NLPwakelock以及NLPcollecterwakelock在唤醒次数以及时间中占了大量的比例(注意:基于Location服务的特性,其唤醒次数高于其他App是正常的。在BetterBatteryStats的统计中,NLPwakelock的比例小于2%可以视为正常。高于4%则可视为异常),那么可以确定你也遇到了此问题。

解决方案:修改位置服务的设置。位置服务有以下几个设置(本人使用英文系统,故只能提供英文关键词,中文类似):

  1. Wifi & Mobile network location
    位于Settings->Location下。关闭可以解决问题,但是之后你的所有应用程序都无法访问位置,严重影响体验,不建议。
  2. Let Google apps access your location
    同样位于位于Settings->Location下,等同于Google Settings->Location中的”Access location”。关闭可以解决问题,但是关闭后所有google服务无法获取位置,比如当你用Chrome访问google.com就会提示你无法获取位置,另外会导致Google now的大多数feature无法正常运作。影响体验,不建议。如果关闭它,NLPwakelock可以降低到一个几乎不唤醒系统的地步,如果你完全不需要google服务,那么可以关闭它来省电。
  3. Location Reporting & Location history
    此设置Google Settings->Location中的”Access location”账号名称下方。后者无影响,前者是真正的罪魁祸首。只要关闭它,NLPwakelock的唤醒比例(基于BetterBatteryStats的统计,下同)可以下降到一个非常合理的数值(5.x%–>1.x%),同时副作用很小(实话说我根本不知道关闭它有什么影响…)。

其他解决方案:Xda很多人汇报,通过删除系统组件Google Play Service以及Maps并手动重新安装,可以在不修改以上任何设置的情况下解决此问题。本人没有Root,无法测试。

底层原因猜想:虽然这是一个非常常见的安卓4.3之后的电量问题,但是并不是所有人都会遇到。而且上面那个“其他解决方案”也给人一种感觉,这个问题可能并不是4.3内在的一个固有bug。在这贴中你可以发现,此人遇到的nlpwakelock耗电问题是因为他的XPrivacy导致的。所以有一定的可能,导致nlpwakelock或者说google services中的location服务耗电的真实原因是某些其他程序不断地调用位置服务而造成。比如一个很可能的原因就是Maps。可惜我没有Root,无法查看log,所以没法确定。Root后的用户可以随便装一个log软件比如LogCat查看log看看到底是什么东西在不断地用location。

附录:电池软件比较

其实我最开始并不是先发现了电池耗电过快,而是发现系统自带的电量统计让我大跌眼镜——android system居然耗掉了90%的电量,直接导致很多程序的用电量小到根本看不见了,而在4.1的时候从来没出现过这样的情况。后来装了GSam Battery Monitor,显示的结果就好很多。另外为了监视wakelock次数,还装了BetterBatteryStats(BBS)和Wakelock Detector(WLD),这里一并比较一下这几款软件之间的区别。

首先,我们应该先搞清楚Wakelock和耗电的区别。Wakelock是指会唤醒设备,自然,设备被唤醒的次数越多,耗电也就越多。但是并不是一个唤醒次数最多的进程,就一定耗电最多——耗电和CPU time才是直接联系。CPU time越多,耗电越多。唤醒只是一个会导致CPU time增加,间接地导致耗电增加的玩意——当然,在待机的情况下,可能是主因。BBS和WLD实际上只能统计wakelock次数和时间,并不能统计真正的耗电;只有Gsam可以显示耗电比例。另外,不同APP对进程的分类也有一定的区别——这里主要体现在系统自带的Power和GSam的区别里。

让我们先对比下系统自带的Power和Gsam:

Screenshot_2013-10-20-17-56-49 Screenshot_2013-10-20-17-57-02 Screenshot_2013-10-20-17-57-12

可以明显感觉到,系统自带的这个一定有什么问题——屏幕耗电的5.4%他居然完全给忽略了,这明显不正常。但是我在网上看贴的时候发现别的人尤其是Nexus 4没有这个问题(其实我4.1的时候也没有这个问题),所以我强烈怀疑是HTC的定制ROM在4.3里把这玩意给搞糟了。另外可以看到两者对QQ的统计的差异——QQ在后者显示耗电7.8%,高于Google services,而前者却直接没有QQ(意味着小于1%)——从道理上可以看出前者更科学一点。我的猜测是QQ耗电里的Wakelock Detail中有个Alearmmanager被自带的算进Android System或者Google Services里去了。另外Kernel (Android OS)啊、HTC啊System UI等等在自带的里面被算进Android System里去了这点应该没有疑问。

那么既然我们觉得Gsam比较靠谱,就详细看看他的各项:

Screenshot_2013-10-20-17-57-19 Screenshot_2013-10-20-17-57-33 Screenshot_2013-10-20-17-57-54

分别是CPU Mnites,Held Awake、Number Times Waking Devices。可以看出,CPU Minites的分布和Power Used基本完全一致。至于Held Awake,在你非待机(操作手机时)全部算进了Kernel里,其他的才是真正意义上的待机唤醒——在接下来讲BBS和WLD时就知道,这两款是会把Kernel和其他的分开统计的。最后一个比较有意思,应该是GSam的独有功能,叫做“唤醒设备的次数”——注意这个并不等于“Wake Lock次数”。这个统计是BBS和WLD都不提供的,但是从直观上理解,是否这个数字应该比Wake Lock次数更有意义呢?另外,GSam也是提供Wake Lock次数统计的,只是要点开每个项目里面才有,并不提供对此排序。

那么接下来让我们看看专精WakeLock统计的BBS和WLD。

Screenshot_2013-10-20-17-58-02 Screenshot_2013-10-20-17-58-08 Screenshot_2013-10-20-17-58-14

注意,因为BBS是自己统计而不是调用系统数据,所以现在他的结果只能从Boot起开始算起而不是Last charged(因为我中间重启了一次手机),所以数字上和WLD和GSam的略有不同。第一幅图是总体统计wake time和sleep time。注意有个每小时耗电统计,非常实用。我现在是每小时不到2%(大部分时间待机),已经算是可以接受了。顺便一提,如果完全关闭Location改服务,可以达到0.x%/h的纯待机。第二张图是大家最关心的Partial Wakelock——前面提过了,Kernel的Wakelock因为我们不关心,被单独分到Kernel Wakelock里去了,这里就不截图了。这里可以看到,NLP相关的依然占有最高的WakeLock次数…不过两者相加也只有2%的比例,算是可以接受。WLD的CPU Wakelock其实和BBS的是一致的(注意Kernel的也是单独的一个分类,没在这里面;另外还有Screen wakelock啥的统计不过没啥用),只是他把所有的进程按照App分类了(点开App可以看到具体的Process),只能按照App排序而不能按照Process排序,两者算是各有利弊吧。顺便一提,BBS支持设定统计起点/终点,这点非常方便。别的几款软件就只能充电才能重置参考点了——当然别的我都用的免费版,BBS用的0元收费版囧。orz,今天才发现GSam也有参考点设置的功能!

Screenshot_2013-10-20-18-02-06 Screenshot_2013-10-20-18-02-14

最后来两张系统自带的的详情。这个里面的数字(CPU、 Awake time)倒是和GSam等同步了,但是你不到5分钟的CPU用了75%的电是闹哪样啦www

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s