【问题标题】:Gradle executing dex Error command line too longGradle 执行 dex 错误命令行太长
【发布时间】:2014-06-10 14:54:30
【问题描述】:
我正在使用 gradle 在 Windows 上构建一个 Android 应用程序,当涉及到最后一个模块时,我遇到了以下错误:
* What went wrong:
Execution failed for task ':client:test:dexApiPhoneDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
C:\adt-bundle-windows\sdk\build-tools\19.1.0\dx.bat --dex --num-threads=
.....
Error Code:
1
Output:
The command line is too long.
我正在使用命令行来构建。我知道如果使用 Maven,可以通过将项目映射到此处描述的磁盘号来解决类似的问题:The command line is too long. in java project with maven
您知道如何使用 Gradle 解决该问题吗?
【问题讨论】:
标签:
android
windows
command-line
gradle
dex
【解决方案1】:
我想出了一个解决方法,它并不完美,但至少可以完成工作。
基本上我的项目在一个很长的目录下,比如:
C:\Development\cloud\my.cloud\main\mycompany\android。
因此,作为一种解决方法,我将此文件夹映射到网络位置,您可以使用 SUBST MS-DOS 命令或在计算机下的资源管理器中使用 GUI“映射网络驱动器”。
实际上我将它映射到一个字母 Z: 并从那里运行我的 gradle 命令,它就像一个魅力。
正如我所说,它并不完美,但至少让我能够继续前进。
【解决方案2】:
制作网络驱动器可以,但似乎速度较慢。
与此相反,我发现创建一个指向真实目录的链接会更好。在 Windows 中是这样的:
mklink /j "D:\myshortname" "D:\my\long\directory\name\causing\trouble\but\its\not\my\fault\leave\me\alone"
然后我只是从符号链接目录而不是真正的目录中打开项目。
【解决方案3】:
我设法通过在 gradle 中更改 Dex 任务的配置来修复它。
在我们的项目中,我们发现 Dex 基本上将“preDex”任务的输出文件作为输入。
由于 Dex 接受一个文件夹作为输入,用该文件夹覆盖 jars 列表对我们来说很有效。
这是我们在根 build.gradle 中添加的代码
task (configureDex) {
gradle.taskGraph.beforeTask { Task task ->
if (task.name.contains("dex") && !task.name.contains("predex")) {
task.libraries = findPredexTask().outputFolder
}
}
}
def findPredexTask(){
gradle.taskGraph.getAllTasks().findAll{ task ->
task.name.toLowerCase().contains('predex')
}
}
此解决方案的缺点是,如果您禁用 pre-dexing,它将失败,但它可以很容易地调整。
另外请注意,您不能直接搜索“dex”或“predex”,因为 android gradle 插件会自动将执行的变体添加到任务名称中。