【问题标题】:Why I see: Unsatisfied constraints: CONNECTIVITY in JobScheduler debug info为什么我看到:未满足的约束:JobScheduler 调试信息中的 CONNECTIVITY
【发布时间】:2020-11-17 16:10:22
【问题描述】:

我为这份工作做好了准备:

 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 不需要: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 是我的身份证。 请求的备用例外是什么意思?

因此,根据以下建议,我很可能网络使用受限,因为我在 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

【问题讨论】:

  • Required constraints 之一是CONNECTIVITY,它不是Satisfied constraints 的一部分。您确定它与Network Capabilities 相关联吗?这似乎是两种不同的东西
  • 您能分享一下您的 JobScheduler 是如何设置的吗?
  • @Eselfar 如果我需要 Wi-Fi 而没有 Wi-Fi,我仍然可以连接,原因是缺少所需的网络功能。但从 ConnectivityController 的实现看来,很多事情都与最终结果有关。不仅是网络能力。我已经添加了作业调度的代码。

标签: android android-workmanager android-jobscheduler


【解决方案1】:

请务必注意,您的应用程序位于RARE standy bucket

 Standby bucket: RARE

这意味着,即使设备具有连接性,您的工作每天也只能访问一次网络。

这在Power Manager restriction 指南中有记录,并附注:

如果网络访问受到限制,应用会被授予 10 分钟的时间窗口,以便在指定的时间间隔内使用网络。

这可能是一个在后台花费大量时间而很少或根本没有用户交互的应用程序。一种可能的解决方案是增加前台时间,添加一些驱动用户打开应用的功能。

【讨论】:

  • 谢谢。我接受您的答案已解决,但老实说,这并不能完全解决我的问题。因为根据文档,我希望每 24 小时至少触发一次,持续 10 分钟。因为是说:“推迟到 24 小时。”但我看到更多的时间。所以我试图找到一个具体的原因。比连接性更具体的东西。目前,如果我发现有用的东西,我正在阅读 ConnectivityController 代码的提交消息。并且没有明显的 hack 可以帮助我在更高的桶中强制,因为该应用程序的目的不是打扰用户。
  • 另一件会影响您的后台工作的是 OEM 限制(如 dontkillmyapp.com 中所述)。您在哪个设备/操作系统版本上看到此行为?
  • 是的。我知道那个网站。例如,小米刚刚死了。工作丢失。我接受。只有关闭电池优化的 WM 才能工作。 JS 根本不起作用。但至少我正在努力使其在三星和 Pixel 等主流设备上相当可靠,我已经看到了这个问题。 RARE 桶的规格期望对我有用。但是当我带着这个“错误”走了两天时,现实让我感到绝望:D 我知道这是 Android,所以没有“确定的事情”,但我正在尽我所能修复。例如在小米上——我知道为什么!这里对我来说很模糊。
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2015-08-24
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 2019-09-12
相关资源
最近更新 更多