【问题标题】:Android Studio: Failed Gradle execution. Cause: Broken PipeAndroid Studio:Gradle 执行失败。原因:断管
【发布时间】:2014-09-22 15:43:55
【问题描述】:

每当我在 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'])
}

【问题讨论】:

  • 你是在模拟器还是设备上试用?
  • 在 app 文件夹中分享你的 build.gradle
  • @nr4bt - 我正在尝试使用设备。这有关系吗?
  • @DheerajBhaskar - 请参阅编辑。
  • 似乎是正确的,我记得在 AndroidStudio Release 页面上看到过这个错误。你在最新版本吗?如果没有,请更新。使用金丝雀频道。

标签: android android-studio


【解决方案1】:

如果您因为 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 中的守护进程之一的输出日志

【讨论】:

    【解决方案2】:

    对于那些从 Google 来这里查看更新的人,在 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

    【讨论】:

      【解决方案3】:

      我在 Fedora 20 上使用 ADS 时遇到了同样的问题。

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

      问题是防火墙规则,它在 tcp 连接到 localhost 时强制使用 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 守护程序仅接受来自 127.0.0.1(环回地址)的连接。但是防火墙规则强制使用公共接口地址。 gradle daemon 拒绝连接,出现“Broken pipe”错误。

      这个问题有两种解决方案:

      1.) 完全禁用 MASQUERADING:

      # sudo firewall-cmd --remove-masquerade
      

      2.) 修复 nat 规则:

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

      【讨论】:

        【解决方案4】:

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

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

        有点难看,但不会破坏任何现有的 IPv4 配置。

        【讨论】:

          【解决方案5】:

          我也遇到过类似的问题,但我注意到在我将 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

          在 linux 上,我只需执行以下操作:

          1. iptables -t nat -F
          2. echo 0 > /proc/sys/net/ipv4/ip_forward

          请记住,上面的解决方案可能会破坏您的防火墙,所以除非您知道自己在做什么,否则不要玩这些东西。

          【讨论】:

            【解决方案6】:

            即使在谷歌搜索之后我也找不到任何人遇到同样的问题,所以我决定了解“Broken pipe”的含义。看了here之后,我只是觉得我系统中的某些进程必须死掉。我刚刚重新启动了我的系统并解决了问题。 :-)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-26
              • 2018-06-02
              • 1970-01-01
              • 2019-06-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多