Gradle执行dex错误命令行太长

我正在使用gradle在窗口上构build一个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. 

我正在使用命令行来build立。 我知道,如果使用Maven将项目映射到磁盘盘符,可以解决类似的问题,如下所述: 命令行太长。 在与Maven的Java项目

你有什么想法如何使用Gradle来解决这个问题?

我想出一个解决方法,这不是完美的,但至少做这项工作。

基本上我的项目是在一个像C:\ Development \ cloud \ my.cloud \ main \ mycompany \ android这样的长目录下。

所以作为一种解决方法,我将此文件夹映射到网络位置,可以通过使用SUBST MS-DOS命令或在您的计算机的资源管理器中使用GUI“映射网络驱动器”来完成此操作。 其实我把它映射到一个字母Z:并从那里运行我的gradle命令,它的工作就像一个魅力。

正如我所说,这不是完美的,但至少让我前进。

使网络驱动器工作,但似乎较慢。

相反,我发现最好创建一个链接到真实的目录。 在Windows中,它是这样的:

 mklink /j "D:\myshortname" "D:\my\long\directory\name\causing\trouble\but\its\not\my\fault\leave\me\alone" 

然后,我只需从symlinked目录而不是真正的目录中打开项目。

我设法通过更改gradle中的Dex任务的配置来修复它。 在我们的项目中,我们发现Dex基本上把“preDex”任务的输出文件作为输入。 由于Dex接受一个文件夹作为输入,覆盖与文件夹的瓶子列表做了我们的伎俩。

这是我们在根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') } } 

这个解决方案的缺点是,如果你禁用了预分离,它将会失败,但是它可以很容易地被修改。

另外请注意,由于android gradle插件会自动将执行的变体添加到任务名称中,因此无法直接搜索“dex”或“predex”。