调试 WorkManager
使用集合让一切井井有条
根据您的偏好保存内容并对其进行分类。
如果您发现 worker 运行过于频繁或根本没有运行,可以参考以下建议
调试步骤,帮助您发现发生的情况。
启用日志记录
如需确定工作器未正确运行的原因,查看详细的 WorkManager 日志很有帮助。要启用日志记录,请使用自定义
初始化。
首先,请停用默认的 WorkManagerInitializer
AndroidManifest.xml
文件,只需使用
已应用清单合并规则 remove
:
<provider
android:name="androidx.work.impl.WorkManagerInitializer"
android:authorities="${applicationId}.workmanager-init"
tools:node="remove"/>
现在,默认 WorkManager 初始化程序已停用,您可以使用按需初始化。为此,android.app.Application
类需要提供实现
对于 androidx.work.Configuration.Provider
:
Kotlin
class MyApplication() : Application(), Configuration.Provider {
override fun getWorkManagerConfiguration() =
Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.DEBUG)
.build()
}
Java
public class MyApplication extends Application implements Configuration.Provider {
@NonNull
@Override
public Configuration getWorkManagerConfiguration() {
return new Configuration.Builder()
.setMinimumLoggingLevel(android.util.Log.DEBUG)
.build();
}
}
当您定义自定义 WorkManager 配置时,您的 WorkManager 是
在调用
WorkManager.getInstance(Context)
而不是在应用启动时自动加载。请参阅自定义 WorkManager
配置和
初始化
包括对 WorkManager 之前的版本
2.1.0。
启用 DEBUG
日志记录后,
您会看到更多带有日志标记前缀 WM-
的日志。
使用 adb shell dumpsys jobscheduler
您可以使用 adb
获取有关 Android 6.0 上的作业调度的更多信息
(API 级别 23)或更高版本。如果您不熟悉 adb
,请参阅命令行
工具。
安装 adb
后,请运行以下命令以查看
归因于您文件包的作业:
adb shell dumpsys jobscheduler
输出类似于以下内容:
JOB #u0a172/4: 6412553 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
u0a172 tag=*job*/com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
Source: uid=u0a172 user=0 pkg=com.google.android.youtube
JobInfo:
Service: com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
Requires: charging=false batteryNotLow=false deviceIdle=false
Extras: mParcelledData.dataSize=180
Network type: NetworkRequest [ NONE id=0, [ Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&VALIDATED Uid: 10172] ]
Minimum latency: +1h29m59s687ms
Backoff: policy=1 initial=+30s0ms
Has early constraint
Required constraints: TIMING_DELAY CONNECTIVITY [0x90000000]
Satisfied constraints: DEVICE_NOT_DOZING BACKGROUND_NOT_RESTRICTED WITHIN_QUOTA [0x3400000]
Unsatisfied constraints: TIMING_DELAY CONNECTIVITY [0x90000000]
Tracking: CONNECTIVITY TIME QUOTA
Implicit constraints:
readyNotDozing: true
readyNotRestrictedInBg: true
Standby bucket: RARE
Base heartbeat: 0
Enqueue time: -51m29s853ms
Run time: earliest=+38m29s834ms, latest=none, original latest=none
Last run heartbeat: 0
Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)
使用 WorkManager 时,负责管理 worker 执行的组件
在 API 级别 23 或更高版本上为 SystemJobService
。查找作业实例
所有资源
androidx.work.impl.background.systemjob.SystemJobService
。
对于每个作业,命令的输出都会列出必需、满足和不满足约束条件。检查工作器的约束条件是否
非常满意。
输出还包括最近执行的作业的作业历史记录,因此您可以使用
用于检查最近是否调用了 SystemJobService
。
Job history:
-1h35m26s440ms START: #u0a107/9008 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService
-1h35m26s362ms STOP-P: #u0a107/9008 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService app called jobFinished
在应用的调试 build 中,您可以从以下位置请求诊断信息:
WorkManager 2.4.0 及更高版本:
adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "<your_app_package_name>"
这提供了以下方面的信息:
- 在过去 24 小时内完成的工作请求。
- 目前正在运行的工作请求。
- 已安排的工作请求。
诊断信息如下所示(输出通过 logcat
显示):
adb shell am broadcast -a "androidx.work.diagnostics.REQUEST_DIAGNOSTICS" -p "androidx.work.integration.testapp"
adb logcat
...
2020-02-13 14:21:37.990 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Recently completed work:
2020-02-13 14:21:38.083 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Id Class Name State Unique Name Tags
08be261c-2def-4bd6-a716-1e4410968dc4 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker
48ce04f1-8df9-450b-96ec-6eceabb9c690 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker
c46f4699-c384-440c-a10e-26d56ce02963 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker
ce125372-046e-484e-949f-9abb35ce62c3 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker
72887ddd-8ed1-4018-b798-fac218e95e16 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker
dcff3d61-320d-4996-8644-5d97944bd09c androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker
acab0bf7-6087-43ad-bdb5-be0df9195acb androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker
23136bcd-01dd-46eb-b910-0fe8a140c2a4 androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
245f4879-c6d2-4997-8130-e4e90e1cab4c androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
17d05835-bb61-429a-ad11-fe43fc320a54 androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
e95f12be-4b0c-4e64-88da-8ee07a31e42f androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
431c3ec2-4a55-469b-b50b-4072d35f1232 androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
883a388f-f911-4098-9143-37bd8fbc098a androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
b904163c-6822-4299-8d5a-78df49b7e53d androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
453fd7b9-2b16-45b9-abc5-3d2ce7b6a4ba androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker
2020-02-13 14:21:38.083 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Running work:
2020-02-13 14:21:38.089 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Id Class Name State Unique Name Tags
b87c8a4f-4ac6-4e25-ba3e-4cea53ce468a androidx.work.impl.workers.DiagnosticsWorker RUNNING null androidx.work.impl.workers.DiagnosticsWorker
...
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-27。
[[["易于理解","easyToUnderstand","thumb-up"],["解决了我的问题","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["没有我需要的信息","missingTheInformationINeed","thumb-down"],["太复杂/步骤太多","tooComplicatedTooManySteps","thumb-down"],["内容需要更新","outOfDate","thumb-down"],["翻译问题","translationIssue","thumb-down"],["示例/代码问题","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["最后更新时间 (UTC):2025-07-27。"],[],[],null,["# Debug WorkManager\n\nIf you notice that your workers run too often or not at all, here are some\ndebugging steps that can help you discover what is happening.\n\nEnable logging\n--------------\n\nTo determine why your workers aren't running properly, it can be very useful to\nlook at *verbose* WorkManager logs. To enable logging, use [custom\ninitialization](/topic/libraries/architecture/workmanager/advanced/custom-configuration).\n\nFirst, disable the default `WorkManagerInitializer` in your\n`AndroidManifest.xml` file by creating a new WorkManager provider with the\nmanifest-merge rule **`remove`** applied: \n\n \u003cprovider\n android:name=\"androidx.work.impl.WorkManagerInitializer\"\n android:authorities=\"${applicationId}.workmanager-init\"\n tools:node=\"remove\"/\\\u003e\n\nNow that the default WorkManager initializer is disabled, you can use [on-demand\ninitialization](/guide/background/persistent/configuration/custom-configuration#on-demand).\nTo do so, the `android.app.Application` class needs to provide an implementation\nfor `androidx.work.Configuration.Provider`: \n\n### Kotlin\n\n```kotlin\nclass MyApplication() : Application(), Configuration.Provider {\n override fun getWorkManagerConfiguration() =\n Configuration.Builder()\n .setMinimumLoggingLevel(android.util.Log.DEBUG)\n .build()\n}\n```\n\n### Java\n\n```java\npublic class MyApplication extends Application implements Configuration.Provider {\n @NonNull\n @Override\n public Configuration getWorkManagerConfiguration() {\n return new Configuration.Builder()\n .setMinimumLoggingLevel(android.util.Log.DEBUG)\n .build();\n }\n}\n```\n\nWhen you define a custom WorkManager configuration, your WorkManager is\ninitialized when you call\n[`WorkManager.getInstance(Context)`](/reference/androidx/work/WorkManager#getInstance(android.content.Context))\nrather than automatically at application startup. See [Custom WorkManager\nConfiguration and\nInitialization](/topic/libraries/architecture/workmanager/advanced/custom-configuration)\nfor more information, including support for versions of WorkManager before\n2.1.0.\n\nWith [`DEBUG`](/reference/android/util/Log#DEBUG) logging enabled, you\nsee a lot more logs with the log-tag prefix `WM-`.\n\nUse adb shell dumpsys jobscheduler\n----------------------------------\n\nYou can use `adb` to get more information about job scheduling on Android 6.0\n(API level 23) or higher. If you are new to `adb`, see [Command-line\ntools](https://developer.android.com/studio/command-line) for more details.\n\nOnce you have `adb` installed, run the following command to look at the list of\njobs that are attributed to your package: \n\n adb shell dumpsys jobscheduler\n\nThe output looks something like this: \n\n JOB #u0a172/4: 6412553 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService\n u0a172 tag=*job*/com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService\n Source: uid=u0a172 user=0 pkg=com.google.android.youtube\n JobInfo:\n Service: com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService\n Requires: charging=false batteryNotLow=false deviceIdle=false\n Extras: mParcelledData.dataSize=180\n Network type: NetworkRequest [ NONE id=0, [ Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&VALIDATED Uid: 10172] ]\n Minimum latency: +1h29m59s687ms\n Backoff: policy=1 initial=+30s0ms\n Has early constraint\n Required constraints: TIMING_DELAY CONNECTIVITY [0x90000000]\n Satisfied constraints: DEVICE_NOT_DOZING BACKGROUND_NOT_RESTRICTED WITHIN_QUOTA [0x3400000]\n Unsatisfied constraints: TIMING_DELAY CONNECTIVITY \\[0x90000000\\]\n Tracking: CONNECTIVITY TIME QUOTA\n Implicit constraints:\n readyNotDozing: true\n readyNotRestrictedInBg: true\n Standby bucket: RARE\n Base heartbeat: 0\n Enqueue time: -51m29s853ms\n Run time: earliest=+38m29s834ms, latest=none, original latest=none\n Last run heartbeat: 0\n Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)\n\nWhen using WorkManager, the component responsible for managing worker execution\nis `SystemJobService` on API level 23 or higher. Look for instances of jobs\nthat are attributed to your package name and\n`androidx.work.impl.background.systemjob.SystemJobService`.\n\nFor every job, the output from the command lists **required** , **satisfied** ,\nand **unsatisfied** constraints. Check whether your worker's constraints are\nfully satisfied.\n\nThe output also includes job history for recently executed jobs, so you can use\nit to check whether `SystemJobService` was invoked recently. \n\n Job history:\n -1h35m26s440ms START: #u0a107/9008 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService\n -1h35m26s362ms STOP-P: #u0a107/9008 com.google.android.youtube/androidx.work.impl.background.systemjob.SystemJobService app called jobFinished\n\nRequest diagnostic information from WorkManager 2.4.0+\n------------------------------------------------------\n\nOn debug builds of your app, you can request diagnostic information from\nWorkManager 2.4.0 and higher using the following command: \n\n adb shell am broadcast -a \"androidx.work.diagnostics.REQUEST_DIAGNOSTICS\" -p \"\u003cyour_app_package_name\u003e\"\n\nThis provides information on:\n\n- Work requests that completed in the last 24 hours.\n- Work requests that are currently running.\n- Work requests that are scheduled.\n\nHere is what it could look like (the output is visible through `logcat`): \n\n adb shell am broadcast -a \"androidx.work.diagnostics.REQUEST_DIAGNOSTICS\" -p \"androidx.work.integration.testapp\"\n\n adb logcat\n ...\n 2020-02-13 14:21:37.990 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Recently completed work:\n 2020-02-13 14:21:38.083 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Id Class Name State Unique Name Tags\n 08be261c-2def-4bd6-a716-1e4410968dc4 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker\n 48ce04f1-8df9-450b-96ec-6eceabb9c690 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker\n c46f4699-c384-440c-a10e-26d56ce02963 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker\n ce125372-046e-484e-949f-9abb35ce62c3 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker\n 72887ddd-8ed1-4018-b798-fac218e95e16 androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker\n dcff3d61-320d-4996-8644-5d97944bd09c androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker\n acab0bf7-6087-43ad-bdb5-be0df9195acb androidx.work.impl.workers.DiagnosticsWorker SUCCEEDED null androidx.work.impl.workers.DiagnosticsWorker\n 23136bcd-01dd-46eb-b910-0fe8a140c2a4 androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n 245f4879-c6d2-4997-8130-e4e90e1cab4c androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n 17d05835-bb61-429a-ad11-fe43fc320a54 androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n e95f12be-4b0c-4e64-88da-8ee07a31e42f androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n 431c3ec2-4a55-469b-b50b-4072d35f1232 androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n 883a388f-f911-4098-9143-37bd8fbc098a androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n b904163c-6822-4299-8d5a-78df49b7e53d androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n 453fd7b9-2b16-45b9-abc5-3d2ce7b6a4ba androidx.work.integration.testapp.ToastWorker SUCCEEDED null androidx.work.integration.testapp.ToastWorker\n 2020-02-13 14:21:38.083 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Running work:\n 2020-02-13 14:21:38.089 29528-29660/androidx.work.integration.testapp I/WM-DiagnosticsWrkr: Id Class Name State Unique Name Tags\n b87c8a4f-4ac6-4e25-ba3e-4cea53ce468a androidx.work.impl.workers.DiagnosticsWorker RUNNING null androidx.work.impl.workers.DiagnosticsWorker\n ..."]]