표시되는 이유 : 충족되지 않은 제약 조건 : JobScheduler 디버그 정보의 CONNECTIVITY

Nov 17 2020

나는 직업을 설정했다.

 val job = JobInfo.Builder(2, ComponentName(context, JobRunner::class.java)).apply {
            setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
            setRequiresBatteryNotLow(true)
            for (triggerUri in triggers) {
                addTriggerContentUri(JobInfo.TriggerContentUri(triggerUri, JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS))
            }
            setTriggerContentUpdateDelay(TimeUnit.MINUTES.toMillis(1))
            setTriggerContentMaxDelay(TimeUnit.MINUTES.toMillis(10))
        }.build()
        
        jobScheduler.schedule(job)

내가 실행하면 : adb shell dumpsys jobscheduler

다음 직업 정보가 있습니다.

JOB #u0a302/2: 89f4090 com.abc.debug/com.abc.mobile.service.job.JobRunner
    u0a302 tag=*job*/com.abc.debug/com.abc.mobile.service.job.JobRunner
    Source: uid=u0a302 user=0 pkg=com.abc.debug
    JobInfo:
      Service: com.abc.debug/com.abc.mobile.service.job.JobRunner
      Internal flags: 1 HAS_FOREGROUND_EXEMPTION
      Requires: charging=false batteryNotLow=true deviceIdle=false
      Trigger content URIs:
        1 content://media/internal/images/media
        1 content://media/external/images/media
        1 content://media/internal/video/media
        1 content://media/external/video/media
      Trigger update delay: +1m0s0ms
      Trigger max delay: +10m0s0ms
      Network type: NetworkRequest [ NONE id=0, [ Capabilities: NOT_METERED&INTERNET&NOT_RESTRICTED&TRUSTED&VALIDATED Unwanted:  Uid: 10302] ]
      Backoff: policy=1 initial=+30s0ms
    Required constraints: BATTERY_NOT_LOW CONNECTIVITY CONTENT_TRIGGER [0x14000002]
    Satisfied constraints: CHARGING BATTERY_NOT_LOW CONTENT_TRIGGER DEVICE_NOT_DOZING BACKGROUND_NOT_RESTRICTED [0x6400003]
    Unsatisfied constraints: CONNECTIVITY [0x10000000]
    Tracking: BATTERY CONNECTIVITY CONTENT
    Standby bucket: RARE
    Base heartbeat: 285
    Enqueue time: -20h50m38s25ms
    Run time: earliest=none, latest=none
    Last run heartbeat: 285
    Ready: false (job=false user=true !pending=true !active=true !backingup=true comp=true)

위의 로그에서 볼 수 있듯이 다음이 필요합니다.

네트워크 유형 : NetworkRequest [NONE id = 0, [기능 : NOT_METERED & INTERNET & NOT_RESTRICTED & TRUSTED & VALIDATED Unwanted : Uid : 10302]]

활성 네트워크 기능을 확인하기 위해 동일한 장치에 다른 작은 응용 프로그램을 만들었습니다.

 val connMgr = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
 val networkCap = connMgr.getNetworkCapabilities(connMgr.activeNetwork)
 Log.d("NETWORK_CHECK", "NetworkCapabilities: [$networkCap]")

결과에서 알 수 있듯이 :

[전송 : WIFI 기능 : NOT_METERED & INTERNET & NOT_RESTRICTED & TRUSTED & NOT_VPN & VALIDATED & NOT_ROAMING & FOREGROUND & NOT_CONGESTED & NOT_SUSPENDED LinkUpBandwidth> = 1048576Kbps LinkDnBandwidth> = 1048576Kbps SignalStrength : -43]

필요한 모든 기능이 있습니다. 여전히 제약 조건이 만족스럽지 않은 것으로 보이는 이유는 무엇입니까?

충족되지 않은 제약 : CONNECTIVITY [0x10000000]

정확히 기능이 아닌 관련 될 수있는 다른 것이 있습니까?

여기에서 확인했지만 유용한 것은 없습니다. ConnectivityController

다른 로그에서 연결 섹션에서 다음을 발견했습니다.

ConnectivityController:
  Requested standby exceptions: 10336 (1 jobs) 10342 (1 jobs) 10391 (1 jobs)

10391 은 내 ID입니다. 무엇 않는 대기 예외 요청 방법을?

따라서 아래 제안 에 따라 RARE 대기 버킷에 있기 때문에 네트워크 사용량이 제한 될 가능성이 큽니다. 여기에서 확인하십시오.

https://developer.android.com/topic/performance/power/power-details

저에게 문제는 위의 작업 정보에서 마지막 트리거에서 ~ 21 시간이 지났으며 종종 일부 휴대 전화 에서는 2 일도 표시 됩니다. 그러나 문서는 다음과 같이 말합니다.

최대 24 시간 지연

그래서 정확히 무슨 일이 일어나고 있는지에 대한 더 많은 정보를 찾고 개선 할 수 있습니다. 우리는 많이 발견하지 못했습니다.

그러나 배터리 최적화를 비활성화하면 큰 차이가 있습니다. 또한 장치가 충전 중일 때도 문제가 없습니다.

https://developer.android.com/training/monitoring-device-state/doze-standby#support_for_other_use_cases

답변

2 pfmaggi Nov 19 2020 at 07:38

애플리케이션이 다음 위치에 있다는 점에 유의해야합니다 RARE standy bucket.

 Standby bucket: RARE

즉, 장치가 연결되어 있어도 작업은 하루에 한 번만 네트워크에 액세스 할 수 있습니다.

이는 Power Manager 제한 가이드에 다음과 같은 메모와 함께 설명되어 있습니다.

네트워크 액세스가 제한되면 앱에 지정된 간격으로 네트워크를 사용할 수있는 10 분의 창이 부여됩니다.

이것은 아마도 사용자의 상호 작용이 거의 또는 전혀없이 백그라운드에서 많은 시간을 보내는 애플리케이션 일 것입니다. 가능한 해결책은 사용자가 앱을 열도록 유도하는 일부 기능을 추가하여 포 그라운드 시간을 늘리는 것입니다.