본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] JobScheduler dumpsys log 분석해보자

by 돼지왕 왕돼지 2020. 7. 24.
반응형


android jobscheduler dumpsys


-

이 명령을 통해 dumpsys 중에 jobscheduler 에 대한 정보들만 발췌해 볼 수 있다.

$ adb shell dumpsys jobscheduler



-

그 중에서 내가 등록한 Job 에 대해 한번 보자.

JOB #u0a241/2: b002751 com.cklee.test/.scheduler.MyJobService

  u0a241 tag=*job*/com.cklee.test/.scheduler.MyJobService

  Source: uid=u0a241 user=0 pkg=com.cklee.test

  JobInfo:

    Service: com.cklee.test/.scheduler.MyJobService

    Requires: charging=false batteryNotLow=false deviceIdle=false

    Minimum latency: +3h0m0s0ms

    Max execution delay: +3h0m0s100ms

    Backoff: policy=1 initial=+30s0ms

    Has early constraint

    Has late constraint

  Required constraints: TIMING_DELAY DEADLINE [0xc0000000]

  Satisfied constraints: TIMING_DELAY DEADLINE DEVICE_NOT_DOZING [0xc2000000]

  Unsatisfied constraints:

  Tracking: TIME

  Standby bucket: RARE

  Base heartbeat: 0

  Enqueue time: -14h50m35s267ms

  Run time: earliest=-11h50m35s267ms, latest=-11h50m35s167ms

  Last run heartbeat: 18

  Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)



-

http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/job/controllers/JobStatus.java#1219

위 코드를 보면 dumpsys 가 찍는 내용이 어떤 것을 의미하는지 볼 수 있다.



-

다른 정보들도 중요하지만 "JobInfo" 부분이 핵심이다.

한번 분석해보자.

JobInfo:

  Service: com.cklee.test/.scheduler.MyJobService

  Requires: charging=false batteryNotLow=false deviceIdle=false

  Minimum latency: +3h0m0s0ms

  Max execution delay: +3h0m0s100ms

  Backoff: policy=1 initial=+30s0ms

  Has early constraint

  Has late constraint


Service: com.cklee.test/.scheduler.MyJobService

    Job 이 실행되면 com.cklee.test/.scheduler.MyJobService 를 launch 시킨다.


Requires: charging=false batteryNotLow=false deviceIdle=false

    이 Job 이 실행되기 위한 요구사항은 없다. (충전중, 배터리가 낮지 않을 때, 단말이 유휴상태일 때 조건들이 있다.)


Minimum latency: +3h0m0s0ms

Max execution delay: +3h0m0s100ms

    Job이 3시간 후에 돌도록 설정 되어 있고, 늦어도 3시간 100ms 시간 안에는 실행되기를 원한다는 의미이다.


Backoff: policy=1 initial=+30s0ms

    policy 의 번호의 의미는 다음과 같다. 1(Linear), 2(Exponential)

    피치 못하게 실행 못 시켰을 때는 linear(1) 하게 재시도 주기를 조정하는데 30초 후에 다시 시도한다는 의미.


Has early constraint

Has late constraint

    별다른 early late 제약사항 없음




-

constraint 부분은 Job 이 실행할 조건을 만족시켰느냐에 초점을 맞추고 있다.

Required constraints: TIMING_DELAY DEADLINE [0xc0000000]

Satisfied constraints: TIMING_DELAY DEADLINE DEVICE_NOT_DOZING [0xc2000000]

Unsatisfied constraints:


    required constraints  는 job 에 요구사항으로 주어진 contraints

    satisfied constraints 는 job 이 dump 를 찍은 시점에 만족시키는 요구사항

    unsatisfied constraints 는 job 이 dump 를 찍은 시점에 만족시키지 못하고 있는 요구사항 (여기서는 없음)



    TIMING_DELAY : 딜레이를 주고 job 을 시작하라고 하는데 그 조건을 만족시켯는가

    DEADLINE : 언제까지는 job 을 꼭 시작해야 한다고 하는데 그 조건을 만족시켰는가

    DEVICE_NOT_DOZING : 단말이 도즈모드가 아닌가

  

  

-

Tracking: TIME

    시간 기반으로 tracking 한다.

    BATTERY, CONNECTIVITY, CONTENT, IDLE, STORAGE, TIME 등의 tracking 기반이 있다.



-

Standby bucket: RARE

    Standby bucket 정보로 RARE 일 경우 Job 이  24h 까지 defer 될 수 있다.



-

Base heartbeat: 0

    job 이 schedule 되거나 마지막으로 작동한 횟수.



-

Enqueue time: -14h50m35s267ms

    dump 를 뜨는 시점 기준 -14h 50m 35s 전에 Job 이 등록되었다.



-

Run time: earliest=-11h50m35s267ms, latest=-11h50m35s167ms

    dump 를 뜨는 시점 기준 최소 -11h 50m 35s 시각에 job 이 실행되었어야 하고, 늦어도 -11h 50m 35s 시각에 실행되었어야 한다.



-

Last run heartbeat: 18

       소스상 정확히 알 수 없지만, 동일 형태의 Job 이 마지막으로 작동한 횟수를 나타내는 듯 하다.



-

Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

    http://androidxref.com/8.1.0_r33/xref/frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java

    Job 이 돌 준비가 되었는가에 대한 내용으로 괄호 안에 있는 조건이 모두 true 여야 돌 준비가 된 것이다.

    job : job.isReady -> 다른 constraint 가 satisfied 됨은 물론, DeviceNotDozing, NotRestrictedInBackground 가 암시적으로 만족되어있어야 한다.

    user : mStartedUsers 에 job 의 userId 가 포함되었는가

    pending : mPendingJob 에 job 이 들어있는가

    active : job 이 isCurrentlyActiveLocked 인가

    backingup : mBackingUpUids 에 job 의 sourceId 가 포함되어 있는가

    comp : component 가 있는가

    


-

위의 예제는 JobScheduler 를 통해 등록한 Job 의 dump 를 어떤 식으로 분석하는가에 대한 예시이다.

상황에 따라 dump 의 내용은 다르기 때문에 위의 자료를 참고하여 본인의 상황에 맞게 구글링 + 소스 분석을 통해 분석하면 되겠다.

JobScheduler 를 다루는 모든 개발자들이여 화이팅!!



-

끝!!




반응형

댓글