6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

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