データをバックグラウンドで読み込むために JobScheduler でジョブを実装しています。ジョブは1日に1回程度発射されます。この機能(おそらくADB)をテストするために使用できるツールは何ですか?
ユースケースは、ジョブの実行に必要な条件をシミュレートできるようにすること、または自動テストスイートの一部として具体的に「このジョブを実行する」と言うことです。
右。
HenningとP4u144は、これをより詳細に答えるために私を正しい軌道に乗せました。
adb Shell dumpsys jobscheduler
コマンドでタスクを識別します。
これにより、次のカテゴリで膨大な出力が得られます。
最も興味があるカテゴリは、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
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のすばらしいライブラリ を使用します。
APIレベルに応じて、JobScheduler
、JobScheduler
、またはGcmNetworkManager
のいずれかを使用して、より低いAPIレベルでAlarmManager
を簡単にバックポートできます。
さらに、firebaseジョブディスパッチャーライブラリを使用します。
Firebase JobDispatcher は、Androidアプリでバックグラウンドジョブをスケジュールするためのライブラリです。これは、Android(APIレベル9以降)。
これがお役に立てば幸いです。
ありがとう
Evernote Android-Job と Firebase JobDispatcher は両方ともメンテナンス専用モードになり、両方ともこれらの種類のジョブにjetpackの WorkManager を使用することを推奨しています。
コマンド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の回答を参照してください。
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:実行するユーザーのジョブを指定します。デフォルトはプライマリまたはシステムユーザーです