多个库和系统 API 都可以获取归因于应用的唤醒锁。这可能会导致您难以识别应用中可能导致问题的唤醒锁。如果您滥用 API,可能会导致应用长时间保持唤醒锁定状态,即使您并未直接调用唤醒锁定 API 也是如此。
本文档列出了您在使用唤醒锁定调试工具时可能会看到的一些常见唤醒锁定名称。您可能还会在 Android Vitals 报告中看到这些名称。在某些情况下,唤醒锁定可能由库或系统 API 创建。在其他情况下,该工具会出于某种原因混淆您在应用中使用的唤醒锁定名称。您可以使用调试工具找出行为异常的唤醒锁定,然后在此文档中查找唤醒锁定名称,以确定哪个 API 可能导致了问题以及如何解决该问题。
本文档介绍了以下唤醒锁定名称。在每种情况下,虽然唤醒锁可能由某些其他库或 API 创建,但锁会归因于调用该 API 的应用。
*alarm*
:由AlarmManager
创建。AudioIn
、AudioMix
:由媒体 API 创建。GOOGLE_C2DM
:在向应用传送 Firebase Cloud Message (FCM) 广播时获取。*job*/<package_name>/<package_and_job_name>
:由 JobScheduler 作业创建。*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
:由 WorkManager 工作器创建。NetworkLocationLocator
、FusedLocation
、*location*
:由位置信息 API 创建。_UNKNOWN
:如果唤醒锁定名称似乎使用了个人身份信息 (PII),则调试工具会显示此错误。
*alarm*
此唤醒锁定由 AlarmManager
获取,并归因于调用应用。AlarmManager
会在闹钟响铃时获取唤醒锁定,并在闹钟广播的 onReceive()
方法执行完毕时释放锁定。
建议
我们建议您遵循以下做法来优化闹钟行为:
- 使用
AlarmManager
优化闹钟调度频率。 - 仅在必要时使用
RTC_WAKEUP
闹钟(用于唤醒设备)。 - 尽量减少使用闹钟,并避免在
onReceive()
方法中执行耗时的工作。
AudioIn
、AudioMix
等
在录制或播放音频时,媒体 API 会获取名称以 Audio
开头的各种唤醒锁。唤醒锁定会归因于发起调用的应用。
在摄像机模式下,当麦克风处于活动状态时,系统会在AudioRecord
捕获期间获取 AudioIn
。在向设备播放 AudioTrack
期间获取 AudioMix
。其他媒体 API 可以获取以 Audio
开头的其他名称的唤醒锁。
建议
我们建议您采用以下做法:
- 请勿使用以
Audio
开头的唤醒锁定名称。 - 如果您使用的是媒体 API,则无需直接获取唤醒锁定;您可以依赖这些 API 为您获取必要的唤醒锁定。
- 使用媒体 API 时,请在不再需要媒体会话时结束该会话。
GOOGLE_C2DM
GCM 会在向应用传递 Firebase Cloud Messaging (FCM) 广播时获取此唤醒锁。FCM 广播 onMessageReceived()
方法执行完毕后,唤醒锁会被释放。
建议
我们建议您遵循以下做法来优化 FCM 行为:
- 优化 FCM 传送频率。
- 除非消息确实需要立即传送,否则请勿使用高优先级 FCM。
- 尽快完成
onMessageReceived()
方法。 如需了解详情,请参阅 Firebase 指南。
*job*/<package_name>/<package_and_job_name>
JobScheduler 作业在后台执行任务时会使用这些唤醒锁。唤醒锁定会归因于创建 worker 的应用。
“<package_name>”是应用软件包的名称,而不是字面文字 <package name>
。同样,“<package_and_job_name>”是指软件包名称后跟作业名称。*job*
是包含星号的字符序列 *job*
;星号并非用作通配符。下面是一个此类唤醒锁名称的示例:
*job*/com.example.app/com.example.app.example.path.ExampleJobService
建议
审核您对 JobScheduler 任务的使用情况。具体而言,请按照我们的指南优化任务调度 API 的电池用量。
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
WorkManager worker 在后台执行任务时会使用这些唤醒锁。唤醒锁定会归因于创建 worker 的应用。
“<package_name>”是应用软件包的名称,而不是字面文字 <package name>
。*job*
是包含星号的字符序列 *job*
;星号并非用作通配符。
建议
审核 WorkManager 工作器的使用情况。具体而言,请按照我们的指南优化任务调度 API 的电池用量。
NetworkLocationLocator
、FusedLocation
、*location*
这些唤醒锁定名称由 LocationManager
和 FusedLocationProviderClient
用于获取和传递设备位置信息。唤醒锁定归因于调用这些 API 的应用。
建议
优化位置信息使用情况。例如,设置超时、批量位置信息请求或使用被动位置信息更新。
_UNKNOWN
如果调试工具认为唤醒锁定名称包含个人身份信息 (PII),则不会显示实际的唤醒锁定名称。而是将唤醒锁定标记为 _UNKNOWN
。例如,如果唤醒锁定名称包含电子邮件地址,工具可能会执行此操作。
建议
遵循唤醒锁定名称最佳实践,并避免在唤醒锁定名称中使用个人身份信息。如果您发现名为 _UNKNOWN
的唤醒锁定归因于您的应用,请尝试确定它是哪个唤醒锁定,并为其指定其他名称。