在连接了调试器的情况下启动会导致android应用挂起 EventLog中的BadPacketException

问题描述

在将Android Studio更新到4.1版并将Android仿真器更新到30.1.5-6855416版之后,我在仿真器中调试时遇到了麻烦。

在停止仿真器,擦除其数据,然后进行冷启动之后,有时我可以成功调试该应用程序,但绝不能超过一次。当它工作时,调试器将附加,并且我会在调试控制台中接收输出。当它不起作用时,或者如果结束调试器会话(通过按红色正方形的“停止”按钮)并尝试第二次调试,我将看到以下两种情况之一:

  1. 调试器无法连接,并且应用程序不断显示waiting for debugger to attach消息,而调试器控制台反复打印Waiting for application to come online,直到最终放弃Could not connect to remote process. Aborting debug session.
  2. 该应用程序将启动(“等待调试器”弹出窗口消失),我在控制台中收到一些正常预期的日志消息,但是该应用程序挂在空白的空白屏幕上,并且我的日志语句停止,既可以在调试控制台中,也可以在logcat中。

即使我重新启动仿真器,重新启动adb-server或在设备上激活开发人员模式并禁用并重新启用USB调试,我也将继续获得此结果。我发现能够连接调试器的唯一方法关闭模拟器,在avd管理器中擦除数据,然后冷启动它。

如果我在没有调试器的情况下启动应用程序(通过在模拟器中单击其图标),则该应用程序可以正常启动,并且我可以返回Android Studio,并将调试器附加到已经运行的进程中,并命中断点。我可以重复多次。此方法没有输出到调试控制台,但是确实显示在logcat中。

这是什么原因造成的,如何恢复连接了调试器的应用程序的启动能力?

[UPDATE]:我现在开始发现即使擦除数据并冷启动后,我也无法再启动带有调试器的应用程序。

我在事件日志中看到了以下内容,不确定是否相关:

12:20 AM    null
                com.android.ddmlib.internal.jdwp.chunkhandler.BadPacketException
                at com.android.ddmlib.internal.jdwp.chunkhandler.JdwpPacket.findPacket(JdwpPacket.java:266)
                at com.android.ddmlib.internal.ClientImpl.getJdwpPacket(ClientImpl.java:696)
                at com.android.ddmlib.internal.MonitorThread.processClientActivity(MonitorThread.java:209)
                at com.android.ddmlib.internal.MonitorThread.run(MonitorThread.java:159)
                

12:20 AM    null
                com.android.ddmlib.internal.jdwp.chunkhandler.BadPacketException
                at com.android.ddmlib.internal.jdwp.chunkhandler.JdwpPacket.findPacket(JdwpPacket.java:266)
                at com.android.ddmlib.internal.ClientImpl.getJdwpPacket(ClientImpl.java:696)
                at com.android.ddmlib.internal.MonitorThread.processClientActivity(MonitorThread.java:209)
                at com.android.ddmlib.internal.MonitorThread.run(MonitorThread.java:159)
                

12:20 AM    null
                java.nio.BufferOverflowException
                at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:206)
                at com.android.ddmlib.internal.jdwp.chunkhandler.JdwpPacket.move(JdwpPacket.java:192)
                at com.android.ddmlib.internal.Debugger.send(Debugger.java:443)
                at com.android.ddmlib.jdwp.JdwpAgent.incoming(JdwpAgent.java:89)
                at com.android.ddmlib.internal.MonitorThread.processClientActivity(MonitorThread.java:205)
                at com.android.ddmlib.internal.MonitorThread.run(MonitorThread.java:159)
                

12:20 AM    Exception during activity from Selector.

12:20 AM    null
                java.nio.channels.CancelledKeyException
                at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:73)
                at sun.nio.ch.SelectionKeyImpl.readyOps(SelectionKeyImpl.java:87)
                at java.nio.channels.SelectionKey.isAcceptable(SelectionKey.java:360)
                at com.android.ddmlib.internal.jdwp.JdwpProxyServer.runAsServer(JdwpProxyServer.java:241)
                at com.android.ddmlib.internal.jdwp.JdwpProxyServer.run(JdwpProxyServer.java:273)
                at java.lang.Thread.run(Thread.java:748)

[Update 2020/10/28]经过多次尝试降级Android安装程序的各个部分之后,我终于能够通过删除avds并卸载模拟器,HAXM和Android Studio本身来恢复调试功能(v4 .1)。然后我做了以下事情:

  • 用29.0.6版替换了我的SDK文件夹中的“平台工具” tools文件
  • 已安装Android Studio 4.0.2
  • 未安装的Android SDK平台R已安装模拟器,然后
  • 用v29.3.2替换了我的SDK文件夹中的“模拟器”文件
  • 更新了我项目的build.gradle文件以使用构建工具4.0.2
  • 为API29创建了新的avd

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)