无法打开调试器端口: java.net.SocketException "Socket closed"

52

当我在Android Studio(版本0.4.4)上尝试调试Android应用程序时,出现了以下错误:

Error running <appname> [assembleDebug]: 
Unable to open debugger port : java.net.SocketException "Socket closed"

这个应用程序已经编译,可以使用adb推送到手机上。 adb没有问题; 我可以完美地安装/监视logcat等。 我可以加载另一个项目,并且可以很好地对其进行调试。 我切换回到这一个项目,但它仍然无法正常工作。 因此,似乎可以排除pc(实际上是在Windows下运行的Linux虚拟机)、Android Studio安装等问题。 我已重新启动了此虚拟机和主机PC。

去年我遇到过这个问题,当时我通过卸载Eclipse来“修复”它(我怀疑它可能正在尝试获取相同的套接字)。

我花了一些时间在Google上搜索并尝试建议,但它们没有任何差别。

该问题发生在我生成签名的proguarded版本的构建之后。 在此之前,我仅运行过调试版本。 但是,我认为创建此发行版构建所做的全部工作只是编辑build.gradle并配置Android Studio自动签名apk。 我已经恢复了build.gradle中的更改,但问题仍然存在。

我在任何Android Studio日志文件中都没有看到相关错误; 好像这个异常被捕获并在屏幕上报告,但没有记录在任何地方。

希望阅读此内容的某人可以提供一些我忽略的更改建议。

10个回答

45
在 Android Studio 桌面版上,点击“选择运行/调试配置”按钮(带有 Android 图标的按钮),您应该能够选择正确的选项。

2
你知道吗,昨晚我通过比较 workspace.xml(一个相当大的文件)并进行更改直到它起作用,才解决了这个问题!每次我执行发布构建(点击 Gradle,然后双击 assembleRelease),它都会将我的运行/调试配置更改为运行 assembleRelease 选项。这有什么意义呢?如何调试 assembleRelease 任务?这是 Android Studio 的一个 bug 吗? - user146043
这对我没有帮助。无论我选择什么,都会收到相同的错误。 - parvus
1
我在哪里可以找到这个按钮?抱歉,我对Android Studio非常陌生 :( - Maciek Czarnik

31

我已经遇到了几周的“Socket closed”错误,这让我有点疯狂。今天我发现,虽然通过调试图标启动仍然会给我一个“Socket closed”,但是如果之后附加调试器就可以工作(参见截图)。希望这能节省其他人的时间。

突出显示连接调试器图标的屏幕截图


另一种解决方案,但过于矫揉造作。通过下拉菜单选择 Android 应用程序(在您的截图中标记为 [InstallDebug] 的应用程序)将轻松完成此操作。 - Sven
这对我来说是一个间歇性的问题。套接字有时会关闭,而其他时候则可以正常工作。在之后附加调试是一种解决方法,但为什么调试端口首先被阻止了呢? - chubbsondubs

25

我能够通过选择“应用程序”配置来解决这个问题。在上面的屏幕截图中,运行按钮左侧的下拉菜单允许您选择配置。选择一个没有括号的。


3
@Triztian 告诉我应该接受哪个答案!不行。这是指“上面”的一张截图(在一个允许用户根据3个不同标准对答案进行排序的网站上,“上面”没有意义),只是已经发布了7个月的另一种被接受的答案变体(应用程序配置)。 - user146043
这也是帮助我最佳的答案。上面的屏幕截图来自于qix在2014年10月9日的回答中。在Android Studio中选择正确的配置是通过“选择运行/调试配置”完成的,该选项可以通过左击运行按钮(绿色右指三角形)左侧的菜单栏下拉菜单中访问。必须选择 Android 应用程序,无论其名称如何。其他的是Gradle构建目标,无法进行调试,因此会出现错误。 - Sven
这个答案只是告诉你如何正确使用Android Studio,如果它只是让你在调试之前选择“app”运行配置。这不是实际问题的答案。 - chubbsondubs

4

我在Linux上遇到了这个错误,问题是另一个先前的进程占用了端口并挂起。因此,解决方案是使用netstat查找阻塞端口的进程,然后杀死该进程,或者您可以重新启动计算机。


请在您的回答中分享快照。 - Raulp

3
为了避免这个问题并从Android Studio中启动,我必须明确地切换我所操作的构建变体(通过选择左侧的“构建变体”时弹出的面板)。然后,在实际按下我的Android应用程序配置的上方的调试按钮(通过Run/Debug图标左侧的下拉菜单选择),它将正确部署我所在的构建变体模式。 (如果我可以设置不同的Android应用程序配置来从下拉菜单中部署不同的构建类型而不必手动切换变量,那就太好了,但我现在看不到如何做到这一点。)
此外,在build.gradle文件的buildTypes部分中,您可能需要使用debuggable true,否则如果您尝试手动附加调试器,则您的进程将不会显示在对话框中。

在 build.gradle 文件中添加“debuggable true”是一个很好的提示!虽然我仍然无法直接从调试器进行调试,但现在我可以附加到我的进程。谢谢! - Litome

2

我遇到了同样的问题,上面的解决方案对我没有用,但我的情况有点特殊:我的应用程序扩展了android.app.Application。我发现适合我的方法是编辑运行/调试配置(“编辑配置...”),并选择“不启动Activity”而不是“启动默认Activity”。


2
我刚遇到这个问题,简单的解决方法是:如果你有多个实例在运行,确保你的运行配置指定了不同的JMX端口。 请参考图片

2

我曾遇到一个类似的Java程序问题。我重新启动了IDE并更改了JMX端口号,之后程序就可以在调试模式下正常运行。


请将此内容放入注释中。这不是一个答案。 - Pranjal Bikash Das
如果这解决了问题,那么它应该被留作答案。 - Jon
为什么这会是个新问题@BatuhanCoşkun?我同意@Jonathan的看法。如果这解决了问题,那就是一个完全有效的答案。它的简短并不代表这只是一条评论。 - Joe

1
我遇到了这个错误,是因为在“运行/调试配置”对话框中,我的“测试类别”选项设置成了“包中所有”,而非“测试类”。当我将其设置为“测试类”时,调试器就可以完美工作了。

enter image description here


-2

请确保您的安卓手机已经连接好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接