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()
    }
    

DEBUG 로깅이 사용 설정되면 로그 태그 접두사 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에 기여한 작업의 인스턴스를 찾아야 합니다.

모든 작업에서 명령어의 출력에는 required, satisfied, unsatisfied 제약 조건이 나열됩니다. 작업자 인스턴스의 제약 조건이 완전히 충족되는지 확인해야 합니다.

다음을 사용하면 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