Gradle - 啥是非零退出值,我该如何解决?
Posted
技术标签:
【中文标题】Gradle - 啥是非零退出值,我该如何解决?【英文标题】:Gradle - What is a non-zero exit value and how do I fix it?Gradle - 什么是非零退出值,我该如何解决? 【发布时间】:2016-08-10 11:26:09 【问题描述】:我正在开发一个 android 应用程序,每次运行时都会收到以下消息:
:module:someTask FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':module:someTask'.
> some message here... finished with non-zero exit value X
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: Y.ZZ secs
我已经尝试清理和构建项目,但错误仍然存在。
我看到了启用 Multidex 或增加堆大小的答案,但我确信我不需要任何一种解决方案。
我能做些什么来解决这个问题?
关于这个问题:这是What is a stack trace, and how can I use it to debug my application errors? 的直接扩展,除了您查看的是 Gradle 堆栈跟踪而不是 Java 堆栈跟踪。
【问题讨论】:
【参考方案1】:前言
该错误消息不足以诊断问题。有ways to get more information,应该先检查一下。
Gradle 输出本身应该指向:module:someTask FAILED
和最后一个:module:someOtherTask
之间消息上方几行中的实际错误。因此,如果您询问有关错误的问题,请编辑您的问题以包含错误的更多上下文。
问题
app:someTask FAILED
的 someTask
部分非常很重要,因为它可以准确地告诉您构建过程的哪个步骤已经崩溃。
这些步骤包括准备依赖项、生成和合并资产和资源文件、检查代码是否有错误和编译,然后最终安装应用程序。
如果 Gradle 在构建过程的任何时候检测到异常,它将抛出一个非零退出值,指示发生了错误。
退出值本身有些重要。
1
只是一般错误代码,错误可能在 Gradle 输出中
2
似乎与重叠依赖或项目配置错误有关。
3
似乎是由于包含了太多的依赖项,或者是内存问题。
可能还有其他人,所以请随时提供您自己的 cmets 或其他值的答案。
解决办法
上述问题的一般解决方案(在尝试清理和重建项目之后)是:
1
- 解决提到的错误。通常,这是compile-time error,这意味着您项目中的某些代码无效。这包括用于 Android 项目的 XML 和 Java。有关进入应用程序的所有内容,请参阅图片
2
& 3
- 这里有很多答案告诉你enable multidex。虽然它可能会解决问题,但它很可能是一种解决方法。如果您不明白为什么要使用它(请参阅链接),您可能不需要它。
如果您无法在 Gradle 日志中找到任何错误输出,那么推荐的做法是打开 Android Studio 的 Gradle 窗口。
为每个模块打开Tasks
文件夹并执行以下一些组合。
build
> clean
后跟build
> build
。
要检查嵌套依赖关系,请使用help
> dependencies
。确保没有重复。
要检查代码中的语法错误和警告,请运行 verification
> lint
。这将输出一个 html 文件,您可以在浏览器中阅读该文件。 Gradle 日志会显示 Wrote HTML report to file:///path/to/app/build/outputs/lint-results.html
,因此只需打开该文件即可查看所有错误和警告。
要尝试在设备上运行该应用,请使用install
> installDebug
。
补充说明
刚安装 Android Studio 时看到很多值为 2 的帖子,但出现错误
'android-studio/jre/bin/java' 以非零退出值 2 结束
安装 Java JDK 并正确配置 Android Studio 以使用 JDK 似乎可以解决此问题。
如果您使用compile 'com.google.android.gms:play-services:X.Y.Z'
提供的Google Play 服务,则只能使用include the dependencies you actually need,否则您很可能确实达到了Multidex 限制。看看如何enable it。
如果您的 Gradle 文件中有一行读取 compile fileTree(dir: 'libs', include: ['*.jar'])
,那么您不需要任何其他包含 compile files('libs/some_file.jar')
的行,因为第一种方式是“将 每个 JAR 文件包含在libs/
目录。”
除此之外,如果您使用 Gradle 并且能够通过搜索 Maven Repository 找到您想要使用的依赖项,那么强烈建议您使用它而不是手动将 JAR 文件放入 @ 987654357@ 目录。对于该站点上的每个库,都有一个 Gradle 选项卡,您只需复制该行并将compile <line you copied>
放入dependencies
部分。
如果你有一行编译了另一个项目,例如compile project(":project_name")
,那么请确保你没有从那里复制依赖项。
另一种解决内存相关问题的方法是扩大堆大小,就像这样从build.gradle
完成
android
// Other stuffs
dexOptions
javaMaxHeapSize "2g" // or "4g" if your device has enough memory
【讨论】:
【参考方案2】:非零退出值就像检查引擎灯。它只是告诉你出了点问题。你仍然需要做进一步的诊断来找出问题到底是什么。首先,您应该在 Gradle 的输出中向上滚动,看看是否还有其他内容可以提供有关问题的更具体的详细信息。
【讨论】:
以上是关于Gradle - 啥是非零退出值,我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
异常:Gradle 任务 assembleDebug 失败,退出代码 1 以非零退出值 1 完成
gradle process 命令 java 以非零退出值 1 结束
Java 以非零退出值 2 完成 - Android Gradle
.gradle/nodejs/node-v6.7.0-darwin-x64/bin/node'' 以非零退出值 1 结束
错误 Gradle Build C:\Program Files\Java\jdk1.7.0_79\bin\java.exe'' 以非零退出值 1 结束