部分唤醒锁定操作卡住

部分唤醒锁定是 PowerManager API 中的一种机制,可让开发者在设备的显示屏关闭后(无论是由于系统超时还是用户按下电源按钮)继续保持 CPU 运行。您的应用会通过调用带有 PARTIAL_WAKE_LOCK 标志的 acquire() 来获取部分唤醒锁定。当您的应用在后台运行时,如果部分唤醒锁定保持了较长时间,则会变为卡住状态(用户看不到应用的任何部分)。这种情况会耗尽设备的电量,因为它会阻止设备进入低功耗状态。部分唤醒锁定仅应在必要时使用,并且在不再需要时立即释放。

如果应用的部分唤醒锁定被卡住,您可以使用本页中的指南来诊断和解决问题。

检测问题

您有时可能并不知道应用的部分唤醒锁定卡住了。如果您已发布了应用,Android Vitals 可以帮助您认识到这个问题。

Android Vitals

当您的应用出现部分唤醒锁定卡住时,Android Vitals 可通过 Play 管理中心提醒您,从而帮助您改进应用性能。Android Vitals 报告部分唤醒锁定卡住的条件是在电池工作时段内后台至少发生了一次时长达 1 小时的部分唤醒锁定。

电池工作时段的定义取决于平台版本。

  • 在 Android 10 中,电池工作时段是在给定的 24 小时内接收到的所有电池报告的汇总。电池报告是指两次电池充电(从低于 20% 充到 80% 以上或者从任意电量值充满到 100%)间隔的时间。
  • 在 Android 11 中,电池工作时段是固定的 24 小时时间段。

显示的电池工作时段是针对应用的所有测量用户的汇总值。如需了解 Google Play 如何收集 Android Vitals 数据,请参阅 Play 管理中心文档。

当您发现应用存在过多的部分唤醒锁定卡住时,下一步就是解决问题。

解决问题

由于唤醒锁定可能会耗尽设备电池电量,因此如果有替代方案,请勿使用唤醒锁定。选择合适的 API 来保持设备唤醒状态文档可帮助您为应用找到最佳解决方案。

如果确实需要使用唤醒锁定,请遵循唤醒锁定最佳实践,确保唤醒锁定不会降低设备效率。特别是,请确保释放您获取的每部设备,并尽快释放锁定。

修复代码中的问题后,请使用以下工具验证您的应用是否正确释放唤醒锁定:

  • dumpsys - 该工具提供有关设备上系统服务状态的信息。若要查看包含唤醒锁定列表的电源服务状态,请运行 adb shell dumpsys power

  • Battery Historian - 该工具用于将 Android bug 报告的输出解析为电源相关事件的可视化表示。