【问题标题】:NetD destroys sockets when device is not connected to charger当设备未连接到充电器时,NetD 会破坏套接字
【发布时间】:2017-06-23 23:50:57
【问题描述】:

我有一个非常烦人的问题,我不明白发生了什么:

我们正在编写一个库,它通过蓝牙建立一个套接字。之后,我们在 localhost 上注册一个服务器。现在有几个应用程序正在建立与 localhost 的连接并发送/接收数据。服务器正在捆绑连接并通过蓝牙处理通信。

我们从 Android 7.0 开始就遇到了这个问题; NetD 经常破坏我们到本地主机的套接字。我们可以在 Logcat 中看到以下输出:

>     06-23 12:38:17.576   522  2676 I Netd    : Destroyed 3 sockets for UidRanges{ 10000-2147483647 } skip={1001 1027 10010 10013 10018 10021
> 10035 10037 10064 10081} in 1.2 ms

所有设备都在运行 Stock Rom,我在以下设备上对其进行了测试:

  • 三星S7
  • 三星S8
  • Nexus 5x
  • 三星S6
  • 谷歌像素

我很确定,这是一种电池节省机制,因为它不会在为设备充电时发生。

我希望任何人都可以帮助我了解这里发生了什么。

【问题讨论】:

    标签: java android


    【解决方案1】:

    我认为问题来自于 Android 6.0 API 级别 23 中引入的新 Doze 功能 enhanced in Android 7.0

    Doze 通过延迟 CPU 和网络活动来延长电池寿命 当用户将设备不插电、静止并留在屏幕上时 关掉。 Android 7.0 通过以下方式对 Doze 进行了进一步增强 在设备运行时应用 CPU 和网络限制的子集 在屏幕关闭的情况下拔下电源,但不一定是静止的, 例如,当手机在用户的口袋中旅行时。

    打瞌睡限制

    以下限制适用于您在打瞌睡时的应用:

    • 网络访问被暂停。
    • 系统忽略唤醒锁。
    • 标准 AlarmManager 警报(包括 setExact() 和 setWindow())被推迟到下一个维护窗口。
      • 如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
      • 使用 setAlarmClock() 设置的警报继续正常触发 - 系统在这些警报触发前不久退出打盹。
    • 系统不执行 Wi-Fi 扫描。
    • 系统不允许同步适配器运行。
    • 系统不允许 JobScheduler 运行

    话虽如此,从技术上讲,您有两种选择 - 拥抱 Doze,与之抗争。

    拥抱打瞌睡

    查看Optimizing for Doze and App Standby

    打瞌睡

    dumpsys deviceidle disable 的组合,将 idle_tomax_idle_to 设置为 1 秒(并将相关的缩放因子设置为 1)将有助于禁用它。参考这个xda-developers post

    【讨论】:

    • 很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2012-05-24
    • 2020-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多