烦恼于Android模拟器ADB频繁断开问题
在Android Studio调试代码时,有一天突然出现模拟器无法正常使用的情况。
无论是运行还是调试过程,ADB都会频繁重启,查看端口链接似乎也会有多个ADB的建立,后期考虑是ADB多次重启,端口连接建立冲突导致。
具体表现就是模拟器刚连接上,就会马上断开。
bash
Connected to the target VM, address: 'localhost:52749', transport: 'socket'
Disconnected from the target VM, address: 'localhost:52749', transport: 'socket'
可是我也没有任何的三方Android模拟器,应该是ADB自身的冲突吧?很奇怪的问题。
一些错误状态我都快会背了,只要一点按钮就会报错。
- ADB处于正在启动/停止的状态
- Pixel XX已经处于活动状态中,具体PID是5XXXX
- Waiting for all devices to come online
- ............
明明已经启动在我眼前了,你为什么要这样?确实像是ADB自己在和自己作对的状态。
期间尝试了很多方法,防火墙开关、切换ADB端口、使用三方模拟器、清理platform-tools、清理ADB的生成数据等。
在网络诸多搜索也没找到解决方案。经AI提醒,突然想起以往碰见过相同情况,意识到后切换,最终成功。
Android模拟器不同类别镜像使用场景区别
贴上目前正常的图,执行端口链接的扫描结果。之前有问题时,会有大量TIME_WAIT状态的链接,现在链接总数量也变少了。
具体出错原因就是,Android模拟器Play镜像使用时会有连接稳定性差的现象,并不适合开发流程时使用。
bash
netstat -ano | findstr :5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 10972
TCP 127.0.0.1:5037 127.0.0.1:51919 ESTABLISHED 10972
TCP 127.0.0.1:5037 127.0.0.1:51920 ESTABLISHED 10972
TCP 127.0.0.1:5037 127.0.0.1:52629 ESTABLISHED 10972
TCP 127.0.0.1:5037 127.0.0.1:52630 ESTABLISHED 10972
TCP 127.0.0.1:5037 127.0.0.1:52738 ESTABLISHED 10972
TCP 127.0.0.1:5037 127.0.0.1:52751 ESTABLISHED 10972
TCP 127.0.0.1:51919 127.0.0.1:5037 ESTABLISHED 30696
TCP 127.0.0.1:51920 127.0.0.1:5037 ESTABLISHED 30696
TCP 127.0.0.1:52629 127.0.0.1:5037 ESTABLISHED 30696
TCP 127.0.0.1:52630 127.0.0.1:5037 ESTABLISHED 30696
TCP 127.0.0.1:52738 127.0.0.1:5037 ESTABLISHED 30696
TCP 127.0.0.1:52751 127.0.0.1:5037 ESTABLISHED 30696
Google Play镜像和Google API镜像的差异导致的冲突
Google Play镜像,功能齐全,内部具有了除了Google地图和基础等登录API外,也有消费者功能,就是Google Play商店应用。此镜像可以最大程度模拟真机使用。但不可以获取ROOT。
Google API则只包含基础API和Google 地图。可以ROOT,功能少,主打稳定性。
这是官方对两种镜像的介绍,以前我基本是混用两者,或者主要使用Play镜像。
除了上述尝试方案外,甚至还重装了一遍Android Studio,结果IDE安装后默认启用的AVD仍然是Play镜像。
现在才意识到两者在开发场景不同有不同的用法。
不出问题的话,混用倒无所谓,出问题了就很难发现原因。
结论
于是,面对基础的开发调试 时,尽量选择Google API镜像,保证开发调试时的稳定性。
在必须使用Google Play功能 时,才选择Google Play镜像,保证业务功能的齐全。