Ionic在下载Gradle时出现Android构建错误

73

我对Ionic框架非常陌生 :)

>npm install -g cordova
>npm install -g ionic
>ionic start test blank
>cd test
>ionic platform add android

当我使用 '>ionic build android' 命令时,开始下载 Gradle,但是我无法下载并且遇到了错误。

是什么导致了这个错误?我该如何解决?!

我已经在电脑上下载并安装了 Gradle,但它似乎还要再次下载。我能否将 Gradle 离线添加到项目中?

C:\Users\LENOVO2014\test>ionic build android
running cordova build android
Running command: "C:\Program Files\nodejs\node.exe" C:\Users\LENOVO2014\myApp\ho
oks\after_prepare\010_add_platform_class.js C:\Users\LENOVO2014\myApp
add to body class: platform-android
Running command: C:\Users\LENOVO2014\myApp\platforms\android\cordova\build.bat
ANDROID_HOME=D:\program\Programing\Android\sdk
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_31
Running: C:\Users\LENOVO2014\myApp\platforms\android\gradlew cdvBuildDebug -b C:
\Users\LENOVO2014\myApp\platforms\android\build.gradle -Dorg.gradle.daemon=true
Downloading http://services.gradle.org/distributions/gradle-2.2.1-all.zip
................................................................................
................................................................................
................................................................................
............................................
Exception in thread "main" java.lang.RuntimeException: java.net.SocketException:
 Connection reset
        at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAcc
essManager.java:78)
        at org.gradle.wrapper.Install.createDist(Install.java:47)
        at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
        at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:189)
        at java.net.SocketInputStream.read(SocketInputStream.java:121)
        at java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
        at sun.net.www.MeteredStream.read(MeteredStream.java:134)
        at java.io.FilterInputStream.read(FilterInputStream.java:133)
        at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Http
URLConnection.java:3335)
        at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Http
URLConnection.java:3328)
        at org.gradle.wrapper.Download.downloadInternal(Download.java:63)
        at org.gradle.wrapper.Download.download(Download.java:45)
        at org.gradle.wrapper.Install$1.call(Install.java:60)
        at org.gradle.wrapper.Install$1.call(Install.java:47)
        at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAcc
essManager.java:65)
        ... 3 more

C:\Users\LENOVO2014\myApp\platforms\android\cordova\node_modules\q\q.js:126
                    throw e;
                          ^
Error code 1 for command: cmd with args: /s /c "C:\Users\LENOVO2014\myApp\platfo
rms\android\gradlew cdvBuildDebug -b C:\Users\LENOVO2014\myApp\platforms\android
\build.gradle -Dorg.gradle.daemon=true"
ERROR building one of the platforms: Error: C:\Users\LENOVO2014\myApp\platforms\
android\cordova\build.bat: Command failed with exit code 1
You may not have the required environment or OS to build this project
Error: C:\Users\LENOVO2014\myApp\platforms\android\cordova\build.bat: Command fa
iled with exit code 1
    at ChildProcess.whenDone (C:\Users\LENOVO2014\AppData\Roaming\npm\node_modul
es\cordova\node_modules\cordova-lib\src\cordova\superspawn.js:131:23)
    at ChildProcess.emit (events.js:110:17)
    at maybeClose (child_process.js:1015:16)
    at Process.ChildProcess._handle.onexit (child_process.js:1087:5)

3
我有同样的问题,由于公司网络的代理,下载失败。我正在寻找解决方案,如果我找到了,我会在这里发布。 - Renan Le Caro
我回到了不使用Graddle的Cordova 4:/ - Renan Le Caro
1
you must use VPN. - hamed hossani
请查看这个重要的评论 - buræquete
18个回答

109

我正在使用Ionic版本1.7.14,并且在以下文件中找到了distributionUrl。myApp/platforms/android/cordova/lib/builders/GradleBuilder.js。

我不得不按照这个答案的规定指定本地下载的gradle。

我有同样的问题。 我将gradle离线添加到了我的项目中。

从发布链接(此处是http://services.gradle.org/distributions/gradle-2.2.1-all.zip)下载gradle后,将其粘贴到类似于myApp\platforms\android\gradle\gradle-2.2.1-all.zip的某个位置,并且在myApp\platforms\android\cordova\lib\build.js 的build.js中查找:

var distributionUrl = 'distributionUrl=http\\://services.gradle.org/distributions/gradle-2.2.1-all.zip';

将其替换为您自己文件的位置:

var distributionUrl = 'distributionUrl=../gradle-2.2.1-all.zip';

9
实际路径为:project/platforms/android/cordova/lib/builders/GradleBuilder.js。 - Ivan Ferrer
1
这个解决方案“基本上”正确,尽管我们应该建议不要修改cordova JS代码。看起来有一个环境变量可以设置来完成这个任务,这是a)较少出错 b)在删除平台目录时不太可能被“覆盖”的更好的选择。 - Jeff Woodard
2
我在以下路径和文件'myApp\platforms\android\cordova\lib\builders\GradleBuilder.js'找到了分发URL。 - RAVI VAGHELA
1
我曾经遇到过同样的问题,但是尝试了多次后问题就解决了。同意@Jeff的说法。 - Jeril Kuruvila
2
@aishapp 请看我的回答。这是正确的解决方案。这个答案不应该被接受,也不应该被高票赞同。我们不应该修改 Cordova 的代码。如果你运行“cordova platform remove android”,这些东西会被删除。 - Jeff Woodard
显示剩余5条评论

52

因为上面发布的解决方案需要将大约55MB的.zip文件放入文件夹中,

您还可以使用以下命令强制CLI在构建过程中使用Ant而不是gradle:

cordova build android -- --ant

ant未安装。该怎么办? - Jay Shukla
1
如果你有无法使用Ant构建的插件,这将无法正常工作。 - Paul
2
我已经尝试了2天在Linux Mint上构建和模拟Ionic应用程序,唯一的方法是这个解决方案:ionic build android -- --ant ionic emulate android -- --ant - zied.hosni

25

我遇到了这个问题,因为我们的网络代理阻止了zip文件的下载。以下是我找到的解决方法:

注意:这种方法与“接受”的答案不同,因为我们没有直接修改Cordova的库。这样做比较不容易出现“错误”,也不会在运行ionic state restore时被覆盖。

  1. 下载gradle - http://services.gradle.org/distributions/gradle-2.2.1-all.zip

  2. 将此文件放置在platforms/android/gradle目录下。但是,如果您正在将其集成到构建流程中,则可能希望将其放在更稳定的位置,并添加一步将该文件复制到该位置的操作。

  3. 设置环境变量CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL../gradle-2.2.1-all.zip

    • linux / osx:在您的~/.bashrc文件中添加export CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL="../gradle-2.2.1-all.zip"
    • windows:setx CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL ../gradle-2.2.1-all.zip
  4. 运行ionic build android


我不理解在Windows中设置环境变量的要点。如何在用户变量或系统变量中设置? - muneeb_ahmed
在第二点中,如何添加一步将文件复制到该位置。 - muneeb_ahmed
1
@muneeb_ahmed 你可以使用Powershell或通过“环境变量”UI设置环境变量。https://dev59.com/QVwY5IYBdhLWcg3wWWm0 - Jeff Woodard
1
另外,关于在那里复制文件,您可以手动复制文件或将其添加到npm任务中等等。有无数的选项可以自动化处理。这在某种程度上取决于您的其他流程。通常情况下,在执行ionic状态还原之后,该文件才会消失。 - Jeff Woodard

14
另一种从命令行运行的选择是在执行cordova构建命令之前运行$ export JAVA_OPTS="-Dhttp.proxyHost=proxy-url.com -Dhttp.proxyPort=911 -Dhttps.proxyHost=secure-proxy-url.com -Dhttps.proxyPort=911"

这样做可以避免您为每个项目复制Gradle文件并修改配置文件。 - Lucas Massuh
但是每次都需要指定这个吗? - Mukus

10

Cordova 6.0.0 / Visual Studio Code 0.10.6

简述:

手动下载 http://services.gradle.org/distributions/gradle-2.2.1-all.zip 文件。

将其放置于 appName\platforms\android\gradle\ 目录下。

set CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=..\gradle-2.2.1-all.zip

开始编写代码并编译。

解释:

GradleBuilder.js 将 distributionUrl 设置为如下内容:

var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'http\://services.gradle.org/distributions/gradle-2.2.1-all.zip';

脚本运行在 appName\platforms\android\gradle\wrapper 中。

输出如下:

正在下载 file://appname/platforms/android/gradle/gradle-2.2.1-all.zip


似乎这并不依赖于 Cordova 6,而是依赖于 Cordova Android 5.0 - 参见此问题。因此,当您将 Cordova Android 更新到5.0时,您可以使用 CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL 环境参数,而无需编辑任何构建文件。 - jakub.g

9
如果您需要在网络上使用代理,则需要在%USER_HOME%/.gradle中添加一个gradle.properties文件,并按照以下方式替换值以使用您的代理详细信息。这对我很有效。
gradlePropertiesProp=gradlePropertiesValue
sysProp=shouldBeOverWrittenBySysProp   
envProjectProp=shouldBeOverWrittenByEnvProp  
systemProp.system=systemValue    
systemProp.http.proxyHost=myproxy.com    
systemProp.http.proxyPort=8080    
systemProp.http.nonProxyHosts=\*.mydomain.com|localhost   
systemProp.https.proxyHost=myproxy.com    
systemProp.https.proxyPort=8080    
systemProp.https.nonProxyHosts=\*.mydomain.com|localhost

这是适用于我的答案(macOS)。如果不存在 gradle.properties 文件,则只需在 platforms/android 中创建一个文件。只需要:systemProp.http.proxyHostsystemProp.http.proxyPortsystemProp.https.proxyHostsystemProp.https.proxyPort - Jonathan Lin

6

大家好,我有同样的问题。

在 platforms\android\cordova\lib\build.js 文件中,我做了如下更改:

var distributionUrl = 'distributionUrl=http\\://services.gradle.org/distributions/gradle-2.2.1-all.zip';

to

var distributionUrl = 'distributionUrl=http://services.gradle.org/distributions/gradle-2.2.1-all.zip';

然后它就运行了。


将使用https的内容更改为使用http。 - Mukus
2
抱歉,在我的 build.js 中没有这个变量,它在 GradleBuilder.js 中。 - Pedro Miguel Pimienta Morales
对我来说,它在 /platforms/android/cordova/lib/builders/StudioBuilder.js 和 /platforms/android/cordova/lib/builders/GradleBuilder.js。 - Rohit Dhiman

4

之前的解决方案似乎存在问题。至少对我来说,它们都无效了,我只是将其更改为:

var distributionUrl = 'http://localhost/gradle-2.2.1-all.zip';

然后,它就工作了。我不知道为什么他们都要在后面添加"distributionUrl=",如下所示(这对我不起作用):
 var distributionUrl = 'distributionUrl=http\\://localhost/gradle-2.2.1-all.zip';

顺便说一下,我正在使用ionic 2。

如果您不想使用localhost,请注意路径。它会在distributionUrl之前自动添加myApp/platforms/android/gradle/wrapper。例如,如果您将gradle-2.2.1-all.zip放置在myApp/platforms/android/gradle目录中,则需要设置:

var distributionUrl = '../gradle-2.2.1-all.zip';

这对我有效,使用Ionic 1和Cordova 6(Cordova-Android 4.1.1)。 - jakub.g

3

如果你在本地主机上有一个Web服务器,可以下载并将Gradle(确切的测试版本,即此帖子发布时的http://downloads.gradle.org/distributions/gradle-2.2.1-all.zip)放在www根目录下,并将应用程序目录中的platforms\android\cordova\lib\build.js文件更改为以下内容:

 var distributionUrl = 'distributionUrl=http\\://localhost/gradle-2.2.1-all.zip';

将URL更改为本地文件(而不是http地址)在Windows上对我无效,它会抱怨该URL具有未知协议。


3

最近我也遇到了同样的问题,四处搜寻解决方法。

最终,在最新版本中我找到了解决方案。

在执行"ionic platform add android"命令后,进入platforms/android/cordova/lib/builders/GradleBuilder.js文件。

查找以下内容:

http\\://services.gradle.org/distributions/gradle-2.2.1-all.zip

并将其更改为

http\\://downloads.gradle.org/distributions/gradle-2.2.1-all.zip

它一直在重置自己。 - iOSAndroidWindowsMobileAppsDev

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