多个库和系统 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 worker 创建。NetworkLocationLocator
、FusedLocation
、*location*
:由位置信息 API 创建。_UNKNOWN
:如果唤醒锁名称似乎使用了个人身份信息 (PII),则调试工具会显示此名称。
*alarm*
此唤醒锁由 AlarmManager
获取,并归因于调用应用。AlarmManager
在闹钟响起时获取唤醒锁,并在闹钟广播的 onReceive()
方法执行完毕后释放该锁。
建议
我们建议采用以下做法来优化闹钟行为
- 使用
AlarmManager
优化闹钟调度频率。 - 仅在必要时使用
RTC_WAKEUP
闹钟(可唤醒设备)。 - 尽量减少闹钟的使用,并避免在
onReceive()
方法中执行长时间工作。
AudioIn
、AudioMix
等
各种以 Audio
开头的唤醒锁是在录制或播放音频时由媒体 API 获取的。这些唤醒锁归因于调用应用。
AudioIn
是在摄像机模式下进行 AudioRecord
捕获期间,麦克风处于活动状态时获取的。AudioMix
是在向设备播放 AudioTrack
期间获取的。其他媒体 API 可能会获取其他以 Audio
开头的唤醒锁。
建议
我们建议采用以下做法
- 不要使用以
Audio
开头的唤醒锁名称。 - 如果您正在使用媒体 API,则无需直接获取唤醒锁;您可以依赖 API 为您获取必要的唤醒锁。
- 当您使用媒体 API 时,在不再需要时结束媒体会话。
GOOGLE_C2DM
此唤醒锁由 GCM 在向应用传送 Firebase Cloud Message (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 worker 使用情况。特别是,请遵循我们关于优化任务调度 API 电池使用的指南。
NetworkLocationLocator
、FusedLocation
、*location*
这些唤醒锁名称由 LocationManager
和 FusedLocationProviderClient
用于获取和传送设备位置。唤醒锁归因于调用这些 API 的应用。
建议
优化位置信息使用。例如,设置超时、批量处理位置信息请求或使用被动位置信息更新。
_UNKNOWN
如果调试工具认为唤醒锁名称包含个人身份信息 (PII),它们将不会显示实际的唤醒锁名称。相反,它们会将唤醒锁标记为 _UNKNOWN
。例如,如果唤醒锁名称包含电子邮件地址,工具可能会这样做。
建议
遵循唤醒锁命名最佳实践,并避免在唤醒锁名称中使用 PII。如果您发现归因于您应用的唤醒锁名为 _UNKNOWN
,请尝试识别它是哪个唤醒锁,并为其指定一个不同的名称。