Gradle – 什么是非零退出值,我该如何解决?

我正在开发一个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 

我已经尝试清理和build设项目,但错误依然存在。

我已经看到答案,说启用Multidex或增加堆大小,但我相信我不需要任何解决scheme。

我能做些什么来解决这个问题?


关于这个问题:这是什么是堆栈跟踪的直接扩展, 我如何使用它来debugging我的应用程序错误? 除非您正在查看Gradle堆栈跟踪而不是Java堆栈跟踪。

前言

该错误消息是不足以诊断问题的信息。 有办法获得更多的信息 ,这应该首先检查。

Gradle输出本身应该指向:module:someTask FAILED和last :module:someOtherTask之间消息之上几行的实际错误。 因此,如果您提出有关您的错误的问题,请编辑您的问题以包含错误的更多上下文。

问题

app:someTask FAILEDsomeTask部分app:someTask FAILED 非常重要,因为它告诉您构build过程的哪个步骤已经崩溃。

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

如果在构build过程的任何时候Gradle检测到一个exception,它将会抛出一个非零的退出值,表示发生了错误。

退出价值本身有点重要。

  • 1是一个普通的错误代码,错误很可能在Gradle输出中
  • 2似乎与重叠的依赖或项目configuration有关。
  • 3似乎是从包括太多的依赖,或内存问题。

有可能是其他人,所以请随时提供您自己的意见或与其他值的答案。

解决scheme

上述的一般性解决scheme(尝试清理和重build项目之后)是:

  • 1 – 解决提到的错误。 通常,这是一个编译时错误 ,这意味着你的项目中的一些代码是无效的。 这包括Android项目的XML和Java。 请参阅图片了解进入应用程序的所有内容

gradle过程

  • 23 – 这里有很多答案告诉你启用multidex 。 虽然它可以解决这个问题,但它很可能是一种解决方法 。 如果你不明白你为什么使用它(见链接),你可能不需要它。

如果在Gradle日志中找不到任何错误输出,那么build议的操作过程就是打开Android Studio的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时,我看到很多post的值是2,并且出现错误

'android-studio / jre / bin / java'用非零的退出值2结束

安装Java JDK并正确configurationAndroid Studio来使用JDK似乎可以解决这个问题。


如果您通过compile 'com.google.android.gms:play-services:XYZ'来使用Google Play服务 ,那么只包含您实际需要的依赖关系 ,否则您最有可能达到了Multidex限制。 了解如何启用它 。


如果你的Gradle文件中有一行读取了compile fileTree(dir: 'libs', include: ['*.jar']) ,那么你不需要任何其他具有compile files('libs/some_file.jar')因为第一种方法是”在libs/目录中包含每个 JAR文件“。

除此之外,如果您正在使用Gradle,并且能够通过searchMaven Repositoryfind您想要使用的依赖项,那么强烈build议您使用它,而不是手动将JAR文件放入libs/目录。 对于该站点上的每个库,都有一个Gradle选项卡,您只需要复制该行,并将compile <line you copied>放入dependencies部分。


如果你有一行编译另一个项目,比如compile project(":project_name") ,那么确保你没有复制依赖关系。


内存相关问题的另一个解决scheme涉及扩展堆大小,这是从build.gradle像这样完成的

 android { // Other stuffs dexOptions { javaMaxHeapSize "2g" // or "4g" if your device has enough memory } } 

一个非零的退出值就像一个检查引擎灯。 它只是告诉你出了点问题。 你仍然需要做进一步的诊断,以确定问题到底是什么。 首先,你应该从Gradle的输出中滚动,看看是否有其他的东西给出了有关错误的更多细节。