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

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

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

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

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

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

评论

我给人的印象是,只有通过使用/ sys / power / wake_lock以“错误”的方式创建唤醒锁,这才是正确的,但是如果使用PowerManager和PowerManager.WakeLock(服务)以“正确”的方式创建唤醒锁,这是正确的。即使您的进程被杀死,它们都将持有真正的唤醒锁并释放它。

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

#1 楼

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

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

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

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

如果您的设备不提供此屏幕(或底部的条形:我只是发现例如运行Android 4.0.3的LG Optimus 4X已切断这些条形),您可以找到它们,例如使用GSam电池监控器:

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

WakeLock的起因是什么?

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

BetterBatteryStats的屏幕截图

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

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

q431431q 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一起列出,并且在转储中甚至与应用程序的技术名称一起被列出,您仍然可以识别它并采取适当的措施。

不明飞行物又如何呢?

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

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

是否有一些建议的进一步阅读资料?

当然。现在,我可能会在以后添加更多内容:



[GUIDE]唤醒锁定义以及如何防止它们(XDA Developers,2013年3月)


评论


对开发人员的更好的教育是说……“释放与开发人员在一起的唤醒锁,然后自己清理一下”?

– t0mm13b
2012年12月7日在22:09

从我这里为您提供令人惊叹的答案!!!你永远不会无聊的吧? :D

– t0mm13b
2012年12月7日在22:14

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

– Izzy♦
2012年12月7日在22:15

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

– Izzy♦
2012年12月7日在22:20

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

– Izzy♦
2012年12月7日在22:33

#2 楼

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

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

不幸的是,尽管它也不是完全有效的,但它已成为支持“电源管理”的事实上的解决方案!围绕唤醒锁进行了广泛的讨论(与用于驱动程序开发的Linux专家Gregh Kroah Hartman进行了精确的链接搜索),其他站点(例如LWN.net)和同一站点上的另一篇文章也对此进行了讨论。这是Gregh Kroah Hartman在该博客上提到的文章,他似乎同意Rafael J. Wysocki提出的替代解决方案,其中记录了很多有关潜在替代方案的信息。不知道在更现代的内核v3.xx中是否确实存在此问题。设计不良的应用程序可能并且经常会请求唤醒锁(例如保持屏幕打开),但实际上,在这种情况下,在屏幕上,实际上有一种更有效的方法:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);


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

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

评论


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

– Izzy♦
2012年12月7日在22:12

#3 楼

查看Wakelock Detector:XDA-Developers / Google Play:

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

点击图片放大。 (来源:Google Play)

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

评论


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

– Izzy♦
13年8月8日在10:23

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

– Izzy♦
2013年3月9日19:35



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

– UzumApps
13年10月10日在2:04

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

– Izzy♦
13年10月10日在2:24

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

– UzumApps
13年10月10日在3:51

#4 楼

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


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

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


从上面的Play商店链接下载WLD
此处使用WLD的手册

说明适用于非根目录设备。它具有所有详细信息,但仅作总结:


在设备上启用USB调试和adb
在笔记本电脑上下载适用于Chrome的Wakelock Unlocker(也适用于Chromium)
启用它,您就完成了!

Wakelock Detector Light版本不显示统计信息,因为Unplugged


reddit上还有另一种选择,其中涉及在此处提到的循环





adb shell dumpsys power | grep -i partial_wake_lock



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