Android Studio:Gradle执行失败。原因:管道破裂

时间:2014-07-30 20:28:37

标签: android android-studio

每当我在android-studio中构建/运行我的android项目时,我会得到一个消息框:Failed to complete Gradle execution.Cause: Broken pipe,然后应用程序的旧版本开始在我的设备上运行。我试图清理项目,但我得到了相同的消息。我尝试了解决方案here,但它没有帮助。我也尝试了解决方案here。我得到gradlew compileDebug --stacktrace --info命令的以下输出:

Task 'compileDebug' is ambiguous in root project 'Wifi'. Candidates are: 'compileDebugAidl', 'compileDebugJava', 'compileDebugNdk', 'compileDebugRenderscript', 'compileDebugTestAidl', 'compileDebugTestJava', 'compileDebugTestNdk', 'compileDebugTestRenderscript'.

* Try:                      
Run gradlew tasks to get a list of available tasks. Run with --debug option to get more log output.

* Exception is:             
org.gradle.execution.TaskSelectionException: Task 'compileDebug' is ambiguous in root project 'Wifi'. Candidates are: 'compileDebugAidl', 'compileDebugJava', 'compileDebugNdk', 'compileDebugRenderscript', 'compileDebugTestAidl', 'compileDebugTestJava', 'compileDebugTestNdk', 'compileDebugTestRenderscript'.
        at org.gradle.execution.TaskSelector.getSelection(TaskSelector.java:69)

我不断收到同样的错误。有人可以帮忙吗?

修改

我的build.gradle如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 15
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.example.pervysage.wifi"
        minSdkVersion 15
        targetSdkVersion 15
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

6 个答案:

答案 0 :(得分:4)

我遇到了类似的问题,但发现当我将Linux笔记本电脑配置为路由器时出现问题。这里的用例是我将通过我的笔记本电脑路由我的手机的WiFi流量,并在调试时嗅探HTTP请求。这似乎混淆了gradle和/或android studio。

删除必要的iptables命令,killall -9 java并重启android studio以解决问题。

导致问题的linux命令(这些和其他类似命令会导致问题):

  1. iptables -t nat -A POSTROUTING -j MASQUERADE
  2. echo 1 > /proc/sys/net/ipv4/ip_forward
  3. 在linux上,我只是执行以下操作:

    1. iptables -t nat -F
    2. echo 0 > /proc/sys/net/ipv4/ip_forward
    3. 请记住,上面的解决方案可能会搞砸你的防火墙,所以除非你知道自己在做什么,否则不要玩这些东西。

答案 1 :(得分:3)

我在Fedora 20上遇到了与ADS相同的问题。

在启用MASQUERADING之前,一切正常。

问题是防火墙规则,它强制在tcp连接到本地主机的SNAT(MASQUERADE)。

# iptables -L POST_public_allow -t nat -v
Chain POST_public_allow (1 references)
 pkts bytes target     prot opt in     out     source       destination
73446 4498K MASQUERADE  all  --  !lo    any     anywhere       anywhere  

由ADS启动的gradle daemin仅接受来自127.0.0.1(环回地址)的连接。但防火墙规则强制使用公共接口地址。 gradle守护程序拒绝连接并发生“Broken pipe”错误。

该问题有两种解决方案:

1。)完全禁用MASQUERADING:

# sudo firewall-cmd --remove-masquerade

2.)修复nat规则:

# iptables -I POST_public_allow -t nat ! -i lo ! -o lo -j MASQUERADE

答案 2 :(得分:1)

对于第三种解决方案,请参阅comment #2 in this thread

  

对我来说唯一的解决方法是使用ipv6而不是ipv4:   在bin / studio.vmoptions或bin / studio64.vmoptions中(取决于你是32位还是64位),通过-Djava.net.preferIPv6Stack = true更改ligne -Djava.net.preferIPv4Stack = true

它有点难看,但它并没有破坏任何现有的IPv4配置。

答案 3 :(得分:0)

因为即使在谷歌搜索后我也找不到任何人有同样的问题,我决定了解“断管”的含义。阅读here之后,我只是觉得我的系统中的某些过程必定会消失。我只是重新启动了我的系统并修复了问题。 : - )

答案 4 :(得分:0)

对于那些从谷歌来这里看一些更新的人来说,这是他们可以尝试的,直到Gradle团队修复它。

  

问题是Gradle守护程序正在尝试使用IPv4而不是IPv6。

     

解决方法1:在Linux上,将以下内容放在〜/ .profile或〜/ .bash_profile中:export _JAVA_OPTIONS =“ - Djava.net.preferIPv6Addresses = true”

     

解决方法2:在Android Studio的vmoptions文件中,将-Djava.net.preferIPv6Addresses = true行更改为-Djava.net.preferIPv6Addresses = true

在官方网站上查看详细信息:http://tools.android.com/knownissues#TOC-Mac-OS-X-Performance

答案 5 :(得分:0)

如果您因为 MASQUERADE 而遇到此问题并且无法禁用它,作为一种解决方法,可以将被视为“远程”(由于伪装)的 IP 添加到环境变量 OPENSHIFT_IP 和然后 gradle 守护进程将允许它 (https://github.com/gradle/gradle/blob/master/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java#L136)。

要找到被阻止的 IP,您需要查看 ~/.gradle/daemon/X.X.X/daemon-XXXXXXX.out.log 中的一个守护进程的输出日志