无法打开调试器端口:java.net.SocketException“套接字关闭”

22

我正在使用Android Studio,使用Gradle多个渠道,每个渠道都有Debug和Release类型,并按照这里底部描述的方式进行组织。当我尝试启动调试器时,我收到以下错误:

Error running androidRecover [installAppDebug]: Unable to open debugger port :     java.net.SocketException "Socket closed

一旦我的设备在运行,我也无法将调试器连接到它(它只显示我的手机名称,而不是应用程序)。

我的三个构建版本都可以成功安装在我的手机上。我只是无法让它允许我进行调试。我还在Nexus平板电脑上测试了附加调试器,结果也是一样的。

这不是Gradle整体问题,因为我可以运行其他基于Gradle的应用程序并且可以很好地连接调试器,因此我想知道是否与我设置Gradle项目和设置有关。

这是我的build.gradle:

apply plugin: 'android'
apply from: 'signing.gradle'

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.3'

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
    }

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile
                     ('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    productFlavors {
        flav1 {
            packageName "com.ex.flav1"
            versionCode 32
            versionName "1.0.5"
            signingConfig signingConfigs.flav1
        }

        flav2 {
            packageName "com.ex.flav2"
            versionCode 33
            versionName "1.0.6"
            signingConfig signingConfigs.flav2
        }

        flav3 {
            packageName "com.ex.flav3"
            versionCode 27
            versionName "1.0.0"
            signingConfig signingConfigs.flav3
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:19.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile files('libs/httpmime-4.2.5.jar')
}

我真的不知道还有什么别的方法可尝试。Android Studio已经完全更新。我重启了Android Studio、手机和电脑。

另外,上周我也遇到了这个问题,但是那时是特定的套接字被阻止了,因为我同时尝试运行模拟器和我的手机。我还注意到我有多个Gradle进程在运行,因为它不能自己杀死它们,我经常不得不杀死Android Studio来结束它们。一旦这个问题解决了,它就会时好时坏地工作。

如果您需要任何其他信息,请告诉我。

谢谢, Devin

编辑 我终于知道为什么@hasanaydogar的答案有效,如果我们当时知道,它可能已经解决了我的问题。请看一下我的第二条评论,了解原因,简而言之,您必须在下拉菜单中选择与您的应用程序根目录匹配的名称。


我在 Mac 上看到了相同的情况。 - scottyab
谢谢!最近我注意到这只发生在某个版本的发布版上。我认为调试版本总是可以工作的。 - craned
5个回答

41

只需点击按钮(位于RUN按钮的左侧)。

输入图像说明

选择Android。 然后运行。

它将连接到您的设备。

不要忘记更改构建变体。

输入图像说明


2
你的截图对我的情况不适用。当我选择下拉菜单中的“android”时,我有以下选项:“编辑配置”,“保存配置”,项目名称以及我迄今为止运行过的各种Gradle命令。偶尔,应用程序会让我连接,但我无法弄清楚每次都如何实现这一点。我收到一个错误提示:警告:调试信息可能无法获取。请关闭其他使用ADB的应用程序:Monitor、DDMS、Eclipse。重新启动ADB集成并重试。正在等待进程:<flavor>。但我不知道该如何修复这个问题。 - craned
1
我终于意识到为什么这个可以工作了。android是你的应用程序根目录的名称,而你的根目录的名称(在我上面的评论中提到的项目名称)将是那个Android图标旁边的任何内容。这也可以很好地与Gradle中的多个flavor一起使用。当单击“ Build Variant”下的调试时,它将变为下拉菜单并显示所有flavor。如果对某人不起作用,我已经详细说明如何解决问题了。 - craned

6
我终于明白为什么会出现那个错误了,所以我将解释一下我现在如何进行Debug。请注意,我使用Gradle(使用相同代码构建多个apk),这可能会影响您使用本答案的第三部分的方式。
要使这些工作正常,您必须在顶部工具栏中调试(图标#1旁边的下拉菜单)和运行按钮中选择以下图标的一个,因为这是您的应用程序的根目录名称,其中包含您的所有代码: enter image description here
  1. 要从头开始调试,我使用工具栏中的此按钮,在Debug模式下运行应用程序:
enter image description here!
  1. 如@scottyab所述,要在应用程序已经运行时附加调试器,我点击工具栏中的Attach Debugger按钮:
enter image description here
  1. 要在调试模式下运行我的应用程序的发布版本,我已经开始更改strings.xml中的Debug版本,文件路径为myApp/src/appNameDebug(verses appNameRelease)/res/values/strings.xml,更容易地在此处(下半部分)看到。当我说更改时,我真的是指有两个版本的所有字符串(我的情况下有3个),这些字符串必须从使用调试服务器更改为使用发布服务器。虽然这可能不完全合规,但只需5秒钟即可进入该文件,按住Cmd+/,并取消注释和注释所有适当的行。
我的Release版本仅用于准备构建发布apk。
以这种方式操作已经消除了错误的弹出。我认为Release版本只是不适合进行调试,并且我还没有找到在Release模式下轻松打开调试标志的方法。

2
我已经参考以下SO答案解决了这个问题。
在Android Studio 2.3.2中,“选择运行/调试配置”按钮如下图所示:

enter image description here

将调试类型更改为Native,如下图所示:

enter image description here


奇怪..这对我也有帮助,但是我不需要本机调试器进行本机C++ Android开发... 在继续之前,我必须安装相应的C++本地开发模块。 - Sold Out
我尝试过这个。它可以运行,但是Java中的断点在Native中不起作用。我删除了现有的Gradle Run/Debug配置,并将调试类型更改为Java,一切都正常工作了。我认为我的问题是我不小心启用了Gradle配置。 - Ian
这个答案不准确。本地调试器是用于本地代码(C/C++)的。 - Paul Lammertsma

2

这在我的应用程序的Debug版本上可以工作,但在Release版本(使用Gradle)上不行。这个解决方案的另一个问题是它允许您尽可能快地单击附加进行调试。如果您需要从一开始就进行调试,那么这将是痛苦的。无论如何,还是谢谢! - craned
发布版本不应该被调试,因为它们被剥离了调试器文件。因此称为“发布”和“调试”。 - ZimaXXX

2
我通过终止并重新启动adb进程来解决了这个问题,希望这可以帮到你 :]


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