Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Cómo depurar WorkManager

Si notas que tus trabajadores se ejecutan con demasiada frecuencia o directamente no lo hacen, a continuación te mostramos algunos pasos de depuración que te ayudarán a descubrir lo que podría estar sucediendo.

Cómo habilitar el registro

Para determinar por qué no se ejecutan correctamente los trabajadores, puede ser muy útil consultar los registros con verbosidad de WorkManager. Para habilitar el registro, debes usar la inicialización personalizada. Primero, inhabilita el objeto WorkManagerInitializer predeterminado de tu AndroidManifest.xml:

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

Ten en cuenta que se usa la regla de fusión de manifiesto remove.

Ahora que está inhabilitado el inicializador predeterminado, puedes usar la inicialización a pedido. Para hacerlo, la clase android.app.Application debe proporcionar una implementación de androidx.work.Configuration.Provider.

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

Una vez que se habilite el registro de depuración, comenzarás a ver muchos más registros con el prefijo de etiqueta WM-.

Cómo usar adb shell dumpsys jobscheduler

En la API nivel 23 o versiones posteriores, puedes ejecutar el comando adb shell dumpsys jobscheduler para ver la lista de trabajos que se atribuyeron a tu paquete.

Verás algo como lo siguiente:

    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)
    

Cuando se usa WorkManager, el componente responsable de administrar la ejecución de Worker es SystemJobService (en la API nivel 23 o versiones posteriores). Debes buscar instancias de trabajos que se atribuyan a tu nombre de paquete y androidx.work.impl.background.systemjob.SystemJobService.

Para cada trabajo, el resultado del comando indica las restricciones obligatorias, satisfechas e insatisfechas. Debes comprobar si las restricciones de tu trabajador están completamente satisfechas.

Puedes usar esta opción para comprobar si se invocó recientemente a SystemJobService. El resultado también incluye el historial de los trabajos ejecutados recientemente:

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