web-dev-qa-db-ja.com

JobSchedulerをテストするために使用できるツールは何ですか?

データをバックグラウンドで読み込むために JobScheduler でジョブを実装しています。ジョブは1日に1回程度発射されます。この機能(おそらくADB)をテストするために使用できるツールは何ですか?

ユースケースは、ジョブの実行に必要な条件をシミュレートできるようにすること、または自動テストスイートの一部として具体的に「このジョブを実行する」と言うことです。

49
greg7gkb

右。
HenningとP4u144は、これをより詳細に答えるために私を正しい軌道に乗せました。

登録されているすべてのジョブを識別する

adb Shell dumpsys jobschedulerコマンドでタスクを識別します。
これにより、次のカテゴリで膨大な出力が得られます。

  • 設定
  • 登録済みXXジョブ
  • 接続性
  • アラーム
  • アイドル状態
  • 電池
  • AppIdle
  • コンテンツ
  • 職歴
  • 保留中のキュー

最も興味があるカテゴリは、Registered XX Jobsです。これにより、デバイスでスケジュールされているジョブの数がわかります。
たとえば、パッケージ名はcom.foo.bar.applicationです。次のようなエントリが表示されます。

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)

ヒント:リストをすばやくフィルターするには、adb Shell dumpsys jobscheduler | grep com.foo.bar.applicationを使用します。

これで、ジョブが正しい基準で登録されているかどうかを簡単に識別できます。

FireBaseJobdispatcher

FirebaseJobDispatcher libを使用する場合は、使用できます

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]

サービスがスケジュールまたは実行されているかどうかを確認します。

タスクを強制的に実行する

Jobを作成すると、JOB_IDが返されます。
このJOB_IDを使用して、ジョブを強制的に実行します。
これを行うには、adb Shell cmd jobscheduler runコマンドを使用します(Android 7.1以降が必要)。

たとえば、パッケージ名はcom.foo.bar.applicationで、JOB_IDは1でした。これで、adbを介してタスクを実行できます。

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

-fオプションを忘れないでください。これにより、設定された制限が満たされない場合でもジョブが強制的に実行されます。

Evernote Android Job Lib

最後になりますが、確かに重要です。
Evernoteのすばらしいライブラリ を使用します。
APIレベルに応じて、JobSchedulerJobScheduler、またはGcmNetworkManagerのいずれかを使用して、より低いAPIレベルでAlarmManagerを簡単にバックポートできます。

編集24/08

さらに、firebaseジョブディスパッチャーライブラリを使用します。

Firebase JobDispatcher は、Androidアプリでバックグラウンドジョブをスケジュールするためのライブラリです。これは、Android(APIレベル9以降)。

これがお役に立てば幸いです。

ありがとう

編集28/04/2019

Evernote Android-JobFirebase JobDispatcher は両方ともメンテナンス専用モードになり、両方ともこれらの種類のジョブにjetpackの WorkManager を使用することを推奨しています。

93
tim

コマンドadb Shell dumpsys jobscheduler現在スケジュールされているジョブとアクティブなジョブに関する情報を取得します。

コマンドの出力がAndroid 6と7の間で大きく異なることに気付きました。Android 5デバイスでは、出力は登録されたジョブの興味深い部分はbuild here であり、便宜上以下に繰り返されています。これは解読に役立ちます。

@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 7デバイスの出力は非常に長く、詳細で読みやすい情報が表示されます。また、履歴などの機能もあります。欠点は、最初に興味深い部分を見つけなければならないことです。

ただし、ジョブを強制的に実行する方法は見つかりませんでした 機能のリクエストがあります p4u144の回答を参照してください。

16
Henning

Android 7.0から、adbシェル用の新しいcmdがあります。7.1(現在のプレビューのみ)では、adb Shell cmd jobschedulerが追加されました こちらをご覧ください JobSchedulerを強制的に実行します。助けは言う:

ジョブスケジューラ(ジョブスケジューラ)コマンド:helpこのヘルプテキストを出力します。

実行[-f | --force] [-u | --user USER_ID] PACKAGE JOB_ID特定のスケジュール済みジョブの即時実行をトリガーします。オプション:-fまたは--force:接続性などの技術的な制約が現在満たされていない場合でもジョブを実行します-uまたは--user:実行するユーザーのジョブを指定します。デフォルトはプライマリまたはシステムユーザーです

14
p4u144