如何处理(孤立的)WakeLock?


40

我想你们大多数人至少听说WakeLocks。你们中的许多人都已经经历过 -无论是否知情。有些人可能会知道如何与他们打交道-但只有极少数人知道如何与“更复杂的候选人”打交道。

对于那些不知道的人,尽管上面的链接给出了一个简短的摘要:应用程序可能会要求a WAKE_LOCK使设备组件保持“休眠”状态,因此即使关闭了显示器,它们也可以执行任务。这在大多数情况下非常有用(例如,在导航时保持屏幕打开状态,保持WiFi激活以播放音乐)–但使用方式错误,会导致电池在短期内耗尽(每小时高达25%) 。

大多数情况下,很容易识别来源(通常是行为不端的应用程序)-我将在下面的答案中对此进行展示,因为它可能对许多用户有帮助。但是,如果请求WakeLock的应用程序退出而不释放它该怎么办?Android系统不会处理它。当然,重新启动可以解决问题-但这并不总是(所需)选项。

因此,从用户的角度来看(我不是在问开发解决方案,而是用户如何处理事情):

用户*可以采取什么措施来解决该问题并避免进一步消耗电池电量?

我更喜欢涉及root的答案(因此所有用户都可以从中受益)。但是,“扎根解决方案”是完全有效的,也很受欢迎。


2
我给人的印象是,仅当您使用来以“错误”的方式创建唤醒锁时,这才是正确的/sys/power/wake_lock,但是如果您使用PowerManager和PowerManager.WakeLock来以“正确”的方式来创建唤醒锁,则该服务都将保留真正的唤醒锁。并释放它,即使您的进程被杀死了……
Izkata 2012年

1
根据我链接的信息,显然不是这样。有人报告在那里检查了内核源,但没有发现任何提示。对开发人员的提示:似乎可以请求定时 “部分唤醒锁” ,因此当计时器启动且唤醒刷新未刷新时,它们将自动过期。那一定是您所指的“安全方式”。
伊齐

Answers:


37

我怎么知道我受到影响了?

对于不熟悉此主题的人来说,这可能是第一个问题。使用Gingerbread(Android 2.3)及更高版本,您将获得一项服务来帮助您确定:电池统计信息。尽管制造商倾向于将其放置在不同的位置,但通常可以在“设置”→“关于手机”→“电池”或类似内容中找到它,并显示已用完大部分电池的应用程序列表。最重要的是一个小图。点击该按钮,它会带您进入类似于此屏幕:

电池状态
Android 2.3上电池电量统计信息的屏幕截图

我从其中一台设备中选择了一张截图来说明问题。查看下方的两个蓝色条(“ Aktiv” =设备保持清醒(活动),“ Bildschirm an” =“屏幕打开”),“ Aktiv”上最右边的蓝色条表示WakeLock:尽管屏幕已关闭的事实。因此,通过此操作,我们可以确定我们有WakeLock-但我们无法确定是谁造成的。

如果您的设备不提供该屏幕(或底部的条形:我刚刚发现例如运行Android 4.0.3 的LG Optimus 4X切断了这些条形),则可以使用GSam Battery Monitor找到它们:

GSam电池监控器
来自GSam Battery Monitor的类似信息-这里提到的“蓝色条”是黄色/橙色

是什么引起了WakeLock?

不幸的是,使用预装的应用程序(也许有些自定义ROM除外)无法回答此问题。但是有可用的工具可以。最知名的候选方法是BetterBatteryStats,并在其部分唤醒锁部分中向我们显示了原因:

BetterBatteryStats BetterBatteryStats2
来自BetterBatteryStats的屏幕截图

在第一个示例2中(从应用程序的playstore页面获取),导致大多数WakeLocks的事件是一个理想的事件:我们不希望在听音乐时停止播放。因此,第二个示例3(取自我的设备之一的真实案例)可能会更好:最上面的3个事件是由同一个应用程序引起的,该应用程序需要WakeLock才能保持IMAP推送服务处于活动状态。

对于BetterBatteryStats的替代方案,请查看UzumApps的答案中提到的Wakelock Detector应用程序-似乎更易于处理,尤其是对于非技术人员:

唤醒锁检测器:应用程序详细信息 唤醒锁检测器:选择进程
唤醒锁检测器-单击图像放大。(来源:Google Play

该怎么办?

如果情况与上一节中的第二个示例一样清楚,则该动作非常明显-至少在我的情况下:当邮件到达时,我不需要立即得到通知;延迟30分钟绝对可以接受。因此,我进入了邮件应用程序,禁用了IMAP Push(另请参见:Push Email),而是切换到30分钟的轮询间隔。WakeLocks并没有完全消失,但明显下降了-电池寿命显着提高。

然后是问题本身提到的情况:行为不良的应用程序未释放其WakeLock。将开发人员与您的发现相面对,并寻求修复。如果他提供:问题已解决。如果没有:几乎总是有其他可用的应用程序。

如果是Android系统本身怎么办?

是的,有时候看起来像是:某些Android服务消耗了98%或更多的东西。哦,如果它是98%,在大多数情况下,该候选人是LocationManagerService。坏人在监视我们?不必要。在这种特殊情况下,列出的“坏蛋”甚至没有罪过-至少不是直接有罪。这是另一个应用程序过于频繁地请求当前位置。在Setera.org上有一篇很好的文章:精确定位Android LocationManagerService的电池消耗。给出一个摘要:它使用Android的dumpsys功能(需要root!)来转储系统状态,并允许您调查为LocationManagerService建立的侦听器。仔细查看它们的配置,可以发现哪些位置在不断“锤击”位置信息(有些是永久性的,即不间断)。由于列出了应用程序的ID,并在转储中的另一个位置列出了ID,甚至连同应用程序的技术名称一样,您仍然可以识别它并采取适当的措施。

那不明飞行物呢?

不幸的是,有这样的情况:注册了WakeLock的应用程序-然后退出而没有释放它。剩下的是*未使用的F *** ing过时*-保持WakeLocks不使用。因此,无法简单地将应用程序置于前台并重新配置,或者使其释放WakeLocks。

我唯一知道的解决方案是重新启动-我想有一个更好的解决方案。当然,如果您知道有罪的应用程序,则与之相关的步骤与上述步骤相同:通知开发人员,获取修复程序或替换该应用程序。但是要摆脱目前的 WakeLock吗?也许其他人可以为重启提供更好的选择?

有推荐的进一步阅读资料吗?

当然。现在,我可能以后再添加:


2
对开发人员的更好的教育是说……“在完成与开发人员在一起的工作后释放唤醒锁,然后自己清理”?
t0mm13b 2012年

3
从我这里为您提供令人惊叹的答案!!!你永远不会觉得无聊吗?:D
t0mm13b 2012年

2
可以-但请参阅我的问题:我不是在询问开发人员,而是从用户角度出发。也许我需要让它变得更明显;)
伊兹

1
无聊?有人可以解释一下吗?XD不,我总是在想什么。如果我觉得它足够好,即使在这里我可能会有一个(部分)答案,我什至在这里问(请参阅我的个人资料:我不常问)。如果问题值得,这里的反馈总是令人耳目一新:)
Izzy

1
请做!并报告您的发现!我刚刚对“孤立的” WakeLocks遇到了描述的问题。闲逛了一个小时,我没有比看到它是LocationManagerService更进一步。所有更新都注册为0秒(原文如此!)是Android设置(=:-0)。我退出了它,停止了它,在命令行中将其杀死了……没有办法摆脱锁。WTF在那里做了设置吗?重启当然可以解决问题-但是这是我们每天必须两次重启的Windows Phone吗?
伊齐

6

简而言之,这是一个非常好的问题,但恐怕,它不仅使最终用户意识到,还需要更多的保证!

重新设计内核以消除唤醒锁,并使用更彻底有效的方法更好地管理原理,从而延长电池寿命。

不幸的是,尽管它也不是完全有效的,但它已被视为支持“电源管理”的事实上的解决方案!有大约wakelocks了广泛的讨论(与Gregh Kroah哈特曼- Linux的大师驱动程序开发-我使用Google的确切linky),其他网站如LWN.net和另一篇文章在同一网站上解释这里。这是Gregh Kroah Hartman在此博客上提到的文章,他似乎同意Rafael J. Wysocki提出的替代解决方案,其中记录了很多有关潜在替代方案的信息。不知道在更现代的内核v3.xx中是否确实存在

设计不良的应用程序可能并且经常会请求唤醒锁,例如保持屏幕打开,但实际上,在这种情况下,保持屏幕打开,实际上存在一种更有效的方法:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

同时,努力为最终用户避免使用术语等,实际上,问题的核心归结为如何管理唤醒锁的内核代码。

这是有关XDA的简要摘要,介绍了未启动者的唤醒锁。通过使用BetterBatteryStats,可以确切地看到哪个进程正在消耗电池,该Wiki托管在github上,并且可以在这里的市场上找到


1
有趣的是,您指向的是我提到的同一XDA线程。我同意您的意见,系统应格外小心(例如,释放不再运行的应用程序请求的WakeLocks)。并且开发人员在编码时应格外小心(通过在LifeCycle的适当状态下明确释放它们)。但这并不能帮助我们的用户了解。我希望我的回答能使用户对用户的功能有所了解,并且希望其中一位“技术人员”能够填补这一空白!
伊齐

3

查看Wakelock Detector: XDA-Developers / Google Play

唤醒锁检测器将应用程序的唤醒锁分组到一个可扩展的视图中,以获得更好的外观。并显示正在运行的应用程序。并且在应用的展开视图中有杀死卸载信息按钮。

唤醒锁检测器:应用程序详细信息 唤醒锁检测器:选择进程
点击图片放大。(来源:Google Play

披露:我是此应用程序的负责任开发人员之一。还有四个朋友和我一起作为业余爱好从事这个项目。


谢谢!这确实是一个有价值的信息。您介意在答案中添加更多详细信息吗,例如,它为何如此特别?我会添加一些屏幕截图。直到完成:这是该应用程序Playstore链接 ...
Izzy

谢谢你的细节!我将它们合并到您的答案中,希望您不要介意:)理解问题:假设某个应用使用“ 0秒”的间隔查询位置。这将导致LocationService唤醒设备。Wake Lock Detector会否将负责的应用程序显示为真正原因-还是LocationService,因为它不是该应用程序包的一部分?
伊齐

您的问题的答案是“否”,因为唤醒锁检测器将属于同一应用程序包名称的唤醒锁分组。由于位置服务属于android os,因此解决方案将检查应用的用户权限
UzumApps

非常感谢!我希望能找到一个简单的解决方案,“如果这是Android系统本身呢?” 部分。似乎没有这种东西-但是,如果可能的话,与WLD集成可能是个好主意:)
Izzy

2
谢谢您的意见,我会考虑并继续努力。WLD看起来不错!!!:)
UzumApps

1

可以帮助无根设备用户的几种方法

  1. 看到该应用程序的开发者之一@Uzumapps发布了使用Wakelock DetectorWLD)的解决方案,令我感到惊讶的是,他尚未更新使用该应用程序的信息,该应用程序也可以在没有root的情况下使用,称为Wakelock Detector Light!我发现这是在寻找针对我的新设备(无根)的解决方案。

这是最近的发展,因此将其发布给未root的设备用户。经过测试可在Moto X Play(Android 6.0.1)上使用

注意:我无法使用第二种方法,欢迎编辑解决方案以使其适用于像我这样的不懂事的人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.