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 FAILED
的someTask
部分app:someTask FAILED
非常重要,因为它告诉您构build过程的哪个步骤已经崩溃。
这些步骤包括准备依赖项,生成和合并资源和资源文件,检查代码是否出错并编译,然后最终安装应用程序。
如果在构build过程的任何时候Gradle检测到一个exception,它将会抛出一个非零的退出值,表示发生了错误。
退出价值本身有点重要。
-
1
是一个普通的错误代码,错误很可能在Gradle输出中 -
2
似乎与重叠的依赖或项目configuration有关。 -
3
似乎是从包括太多的依赖,或内存问题。
有可能是其他人,所以请随时提供您自己的意见或与其他值的答案。
解决scheme
上述的一般性解决scheme(尝试清理和重build项目之后)是:
-
1
– 解决提到的错误。 通常,这是一个编译时错误 ,这意味着你的项目中的一些代码是无效的。 这包括Android项目的XML和Java。 请参阅图片了解进入应用程序的所有内容
-
2
&3
– 这里有很多答案告诉你启用multidex 。 虽然它可以解决这个问题,但它很可能是一种解决方法 。 如果你不明白你为什么使用它(见链接),你可能不需要它。
如果在Gradle日志中找不到任何错误输出,那么build议的操作过程就是打开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的输出中滚动,看看是否有其他的东西给出了有关错误的更多细节。