当设备未连接到充电器时,NetD会破坏插座

时间:2017-06-23 12:26:07

标签: java android

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

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

自Android 7.0以来,我们遇到了这个问题; NetD经常将我们的套接字破坏到localhost。我们可以在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 Roms,我测试了以下内容:

  • 三星S7
  • 三星S8
  • Nexus 5x
  • 三星S6
  • Google Pixel

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

我希望有人能帮助我理解这里发生的事情。

1 个答案:

答案 0 :(得分:3)

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

  

Doze通过延迟CPU和网络活动来延长电池寿命   当用户将设备拔出,固定不动并与屏幕一起时   关掉。 Android 7.0为Doze带来了进一步的增强功能   在设备运行时应用CPU和网络限制的子集   在屏幕关闭时拔掉插头,但不一定是静止的,   例如,当手机在用户的口袋里旅行时。

打盹限制

以下限制适用于您在Doze中的应用:

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

据说,你在技术上有两种选择 - 拥抱Doze,对抗它。

拥抱打瞌睡

浏览Optimizing for Doze and App Standby

打瞌睡

dumpsys deviceidle disable,将idle_tomax_idle_to设置为1秒(以及关联的缩放系数为1)的组合将有助于禁用它。请参阅此xda-developers post