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 FAILEDsomeTask 部分非常很重要,因为它可以准确地告诉您构建过程的哪个步骤已经崩溃。

这些步骤包括准备依赖项、生成和合并资产和资源文件、检查代码是否有错误和编译,然后最终安装应用程序。

如果 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 结束

任务 ':app:dexDebug' 非零退出值 2 执行失败