Estamos implementando un Trabajo a través de JobScheduler para la carga de datos del fondo. El trabajo se incendio una vez al día. ¿Qué herramientas están disponibles para nosotros para probar esta funcionalidad (posiblemente BAD)?

Casos de uso son para ser capaz de simular las condiciones que se requieren para un Trabajo para que se ejecute o simplemente para decir «Ejecutar este trabajo» como parte de nuestro paquete de pruebas automáticas.

InformationsquelleAutor greg7gkb | 2016-08-10

4 Comentarios

  1. 95

    A la derecha.

    Henning y P4u144 me puso en el camino correcto para responder a esto con más detalle.

    Identificar todos los puestos de trabajo

    Identificar su tarea con la adb shell dumpsys jobscheduler de comando.

    Esto le dará una gran salida en las siguientes categorías.

    • Configuración
    • Registrado XX Puestos de trabajo
    • Conectividad
    • Alarmas
    • Inactivo
    • Batería
    • AppIdle
    • Contenido
    • Historial de trabajo
    • Cola de pendientes

    La categoría que tienen más probabilidades de estar interesados en que se Registrado XX Puestos de trabajo. Esto indica cuántos puestos de trabajo se han programado en el dispositivo.

    Por ejemplo, su packagename es com.foo.bar.application usted debe ver una entrada como esta:

    JOB #u0a93/17: eec3709 com.foo.bar.application/com.evernote.android.job.v21.PlatformJobService
        u0a93 tag=*job*/com.foo.bar.application/com.evernote.android.job.v21.PlatformJobService
        Source: uid=u0a93 user=0 pkg=com.foo.bar.application
        JobInfo:
          Service: com.foo.bar.application/com.evernote.android.job.v21.PlatformJobService
          PERIODIC: interval=+15m0s0ms flex=+5m0s0ms
          PERSISTED
          Requires: charging=false deviceIdle=false
          Network type: 2
          Backoff: policy=1 initial=+30s0ms
          Has early constraint
          Has late constraint
        Required constraints: TIMING_DELAY DEADLINE UNMETERED
        Satisfied constraints: CONNECTIVITY NOT_ROAMING APP_NOT_IDLE DEVICE_NOT_DOZING
        Unsatisfied constraints: TIMING_DELAY DEADLINE UNMETERED
        Earliest run time: 07:23
        Latest run time: 12:23
        Ready: false (job=false pending=false active=false user=true)

    Sugerencia: Utilice adb shell dumpsys jobscheduler | grep com.foo.bar.application filtrar rápidamente la lista.

    Ahora usted puede identificar fácilmente si su trabajo ha sido registrado con la correcta criterios.

    FireBaseJobdispatcher

    Si utiliza FirebaseJobDispatcher lib puede utilizar

    adb shell dumpsys activity service GcmService | grep com.foo.bar.debug
    com.foo.bar.debug:0 v853
    u0|com.foo.bar.debug: 3
    (scheduled) com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="com.foo.bar.debug.job.FetchArticlesJob" trigger=window{start=10800s,end=11700s,earliest=10448s,latest=11348s} requirements=[NET_UNMETERED,DEVICE_IDLE] attributes=[PERSISTED,RECURRING] scheduled=-351s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
    (scheduled) com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="com.foo.bar.debug.job.FetchNotificationGroupsJob" trigger=window{start=86400s,end=129600s,earliest=86048s,latest=129248s} requirements=[NET_CONNECTED,CHARGING] attributes=[PERSISTED,RECURRING] scheduled=-351s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
    (scheduled) com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver{u=0 tag="com.foo.bar.debug.job.RemoveUnusedRealmArticlesJob" trigger=window{start=577980s,end=608400s,earliest=521961s,latest=552381s} requirements=[NET_ANY] attributes=[PERSISTED,RECURRING] scheduled=-56018s last_run=N/A jid=N/A status=PENDING retries=0 client_lib=FIREBASE_JOB_DISPATCHER-1}
    (finished) [com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver:com.foo.bar.debug.job.UpdateNotificationGroupJob,u0]
    (finished) [com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver:com.foo.bar.debug.job.UpdatePushTokenJob,u0]
    (finished) [com.foo.bar.debug/com.firebase.jobdispatcher.GooglePlayReceiver:com.foo.bar.debug.job.FetchArticlesJob,u0]

    para comprobar si su servicio ha sido programado o ejecutar.

    Fuerza de su tarea para que se ejecute

    A la hora de crear un Job de obtener una JOB_ID devuelto.

    El uso de este JOB_ID a la fuerza que se ejecute el trabajo.

    Usted puede hacer esto mediante el uso de la adb shell cmd jobscheduler run comando, (requiere Android 7.1 o superior).

    Por ejemplo, su packagename es com.foo.bar.application y la JOB_ID fue de 1.
    Ahora usted puede ejecutar su tarea a través de adb

    adb shell cmd jobscheduler run -f com.foo.bar.application 1

    No olvides el -f opción como esto obliga a que el trabajo se ejecute, incluso si las restricciones no se cumplen.

    Evernote Android De Trabajo Lib

    Por último, pero ciertamente no menos importante.

    Uso la maravillosa biblioteca de Evernote para esto.

    Esto permite una fácil adaptando cambios de la JobScheduler en la parte inferior de la API de niveles de uso de cualquiera de JobScheduler, GcmNetworkManager o AlarmManager dependiendo de su nivel de API.

    Editar 24/08

    Incluso un mejor uso de la base avanzada de trabajo despachador de la biblioteca.

    La Firebase JobDispatcher es una biblioteca de programación de tareas en segundo plano en su aplicación de Android. Proporciona un JobScheduler compatible con API que funciona en todas las versiones recientes de Android (API de nivel 9+) que tiene Google Play instalado.

    Espero que esto ayudó.

    Gracias

    Editar 28/04/2019

    Tanto Evernote Android-Trabajo y Firebase JobDispatcher ahora están en mantenimiento sólo el modo y ambos se sugieren para el uso del jetpack WorkManager para este tipo de trabajos.

    • Buen resumen! Yo sólo quería añadir que todo lo que escribió se aplica para Android de 7. JobScheduler es de a bordo, ya que Android 5, el resultado es diferente. Sólo si alguien maravillas.
    • En mi caso, Firebase JobDispatcher utilizado GcmNetworkManager para programar trabajos, incluso en Android O, en lugar de la plataforma disponible JobScheduler — por lo que no podía utilizar este comando para forzar a que el trabajo se ejecute. Tuve que cambiar a evernote para android de trabajo, que hace uso de la plataforma de JobScheduler en la api de 21+.
    • La salida no dice Running job [FORCED] pero el trabajo no se ejecuta. Probado en emulador con Android O.
    • no se puede encontrar el comando similar para workmanager. ¿existe?
  2. 17

    Con el comando adb shell dumpsys jobscheduler usted obtener información acerca de los programados y los puestos de trabajo activos.

    Me di cuenta de que la salida del comando difiere en gran medida entre Android 6 y 7. Con un Android 5 dispositivo de la salida es muy corta y a veces críptico. La parte interesante con el registrado puestos de trabajo es construir aquí y repite a continuación para su conveniencia, lo que debería ayudar con la explicación:

    @Override
    public String toString() {
    return String.valueOf(hashCode()).substring(0, 3) + ".."
    + ":[" + job.getService()
    + ",jId=" + job.getId()
    + ",u" + getUserId()
    + ",R=(" + formatRunTime(earliestRunTimeElapsedMillis, NO_EARLIEST_RUNTIME)
    + "," + formatRunTime(latestRunTimeElapsedMillis, NO_LATEST_RUNTIME) + ")"
    + ",N=" + job.getNetworkType() + ",C=" + job.isRequireCharging()
    + ",I=" + job.isRequireDeviceIdle() + ",F=" + numFailures
    + ",P=" + job.isPersisted()
    + (isReady() ? "(READY)" : "")
    + "]";
    }

    Android de 7 dispositivos en el otro lado, tienen una muy larga de salida con más y mejor información legible. También hay opciones más, como una historia. El inconveniente es que tienes que encontrar las partes interesantes de la primera.

    no he encontrado una manera de forzar a un puesto de trabajo a ejecutar, aunque, hay una característica solicitud para ello. Ver la respuesta de p4u144.

    • Henning: el vínculo con El «Android 6» código tiene en realidad apunta a la paleta de liberación de la rama, que es ligeramente diferente de la melcocha de la rama de producción.
    • cambiado a «android 5» gracias
  3. 14

    De partida en Android 7.0, hay una nueva cmd para adb shell. Y en 7.1 (sólo en la vista previa a la derecha), la adb shell cmd jobscheduler se ha añadido como se puede ver aquí a la fuerza de su JobScheduler.
    La ayuda dice:

    Trabajo de programador (jobscheduler): comandos de ayuda
    Imprimir este texto de ayuda.

    ejecutar [-f | –force] [-u | –usuario USER_ID] PAQUETE JOB_ID
    Desencadenar la inmediata ejecución de un determinado trabajo programado.
    Opciones:
    -f o –force: ejecutar el trabajo, incluso si las limitaciones técnicas, tales como
    conectividad actualmente no se cumplen
    -u o –usuario: especifica que el usuario del trabajo que se debe ejecutar; el valor predeterminado es
    el principal o el usuario del sistema

  4. -1

    Este es trabajo para mí, sin la necesidad de usar los comandos adb. Se requiere minSdk 21

    @RunWith(AndroidJUnit4.class)
    @TargetApi(VERSION_CODES.LOLLIPOP)
    public abstract class BaseJobServiceTest {
    protected final Context context() {
    return InstrumentationRegistry.getTargetContext();
    }
    protected final void launchJobAndWait(JobInfo jobInfo) throws InterruptedException {
    JobScheduler scheduler = (JobScheduler) context().getSystemService(Context.JOB_SCHEDULER_SERVICE);
    scheduler.schedule(jobInfo);
    while (jobExecutionPending(scheduler, jobInfo)) {
    Thread.sleep(50);
    }
    }
    private boolean jobExecutionPending(JobScheduler scheduler, JobInfo jobInfo) {
    if (VERSION.SDK_INT >= VERSION_CODES.N) {
    return scheduler.getPendingJob(jobInfo.getId()) != null;
    }
    List<JobInfo> scheduledJobs = scheduler.getAllPendingJobs();
    for (int i = 0, size = scheduledJobs.size(); i < size; i++) {
    if (scheduledJobs.get(i).getId() == jobInfo.getId()) {
    return true;
    }
    }
    return false;
    }
    }
    • Periódicas a los puestos de trabajo, no el programador.getPendingJob() siempre regreso no nulo?
    • podría ser el caso, yo no estoy usando ahora mismo, así que no puedo decir. Tal vez hay una forma para identificar si se trata de un nuevo JobInfo? No sé si es igual a hacer el trabajo.
    • Esta es una clase de prueba, queremos forzar el hilo principal para ir a dormir.

Dejar respuesta

Please enter your comment!
Please enter your name here