调试 WorkManager

如果您发现您的工作器运行过于频繁或根本没有运行,请按照以下几个调试步骤操作,以发现可能存在的问题。

启用日志记录

如需确定工作器未正确运行的原因,查看详细的 WorkManager 日志很有帮助。如需启用日志记录功能,您需要使用自定义初始化。首先,在您的 AndroidManifest.xml 中停用默认的 WorkManagerInitializer

    <provider
        android:name="androidx.work.impl.WorkManagerInitializer"
        android:authorities="${applicationId}.workmanager-init"
        tools:node="remove" />
    

请注意,清单合并规则 remove 正在使用。

默认初始化程序已停用,您可以使用按需初始化。为此,android.app.Application 类必须提供 androidx.work.Configuration.Provider 的实现。

class MyApplication() : Application(), Configuration.Provider {
        override fun getWorkManagerConfiguration() =
            Configuration.Builder()
                .setMinimumLoggingLevel(android.util.Log.DEBUG)
                .build()
    }
    

启用调试日志记录后,系统会开始显示更多包含日志标记前缀 WM- 的日志。

使用 adb shell dumpsys jobscheduler

搭载 API 级别 23 或更高版本时,您可以运行命令 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 时,负责管理工作器执行的组件为 SystemJobService(搭载 API 级别 23 或更高版本)。您应该查找归因于您的软件包名称和 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