Men-debug WorkManager

Jika mendapati bahwa Pekerja terlalu sering dijalankan atau tidak dijalankan sama sekali, berikut langkah-langkah proses debug yang dapat membantu mengetahui apa yang terjadi.

Mengaktifkan Logging

Untuk menentukan alasan Pekerja tidak berjalan sebagaimana mestinya, Anda dapat melihat log WorkManager panjang. Untuk mengaktifkan logging, Anda perlu menggunakan inisialisasi kustom. Pertama, nonaktifkan WorkManagerInitializer default di AndroidManifest.xml Anda:

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

Perlu diperhatikan bahwa aturan penggabungan manifes remove sedang digunakan.

Setelah penginisialisasi default dinonaktifkan, Anda dapat menggunakan inisialisasi on demand. Untuk melakukannya, class android.app.Application perlu menyediakan implementasi untuk androidx.work.Configuration.Provider.

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

Setelah logging DEBUG diaktifkan, Anda akan mulai melihat banyak log dengan awalan tag log WM-.

Menggunakan jobscheduler dumpsys shell adb

Pada API level 23 atau yang lebih tinggi, Anda dapat menjalankan perintah adb shell dumpsys jobscheduler untuk melihat daftar tugas yang telah diatribusikan ke paket Anda.

Anda akan melihat yang seperti ini:

    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)
    

Saat menggunakan WorkManager, komponen yang bertanggung jawab untuk mengelola eksekusi Pekerja adalah SystemJobService (pada API level 23 atau yang lebih tinggi). Anda harus mencari instance tugas yang diatribusikan ke nama paket Anda dan androidx.work.impl.background.systemjob.SystemJobService.

Untuk setiap tugas, output dari perintah mencantumkan batasan wajib, terpenuhi, dan tidak terpenuhi. Anda harus memeriksa apakah batasan Pekerja benar-benar terpenuhi.

Anda dapat menggunakan ini untuk memeriksa apakah SystemJobService dipanggil baru-baru ini. Output juga menyertakan histori tugas untuk tugas yang dijalankan baru-baru ini:

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