Gradle执行dex Error命令行太长

时间:2014-06-10 14:54:31

标签: android windows command-line gradle dex

我正在使用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解决该问题?

3 个答案:

答案 0 :(得分:2)

我想出了一个解决方法,它并不完美,但至少可以胜任这项工作。

基本上我的项目是在一个很长的目录下,如: C:\发展\云\ my.cloud \主\ myCompany中\机器人

因此,作为解决方法,我将此文件夹映射到网络位置,您可以使用SUBST MS-DOS命令或在计算机下的资源管理器中使用GUI"映射网络驱动器"。 实际上我将它映射到一个字母Z:并从那里运行我的gradle命令,它就像一个魅力。

正如我所说,它并不完美,但至少让我继续前进。

答案 1 :(得分:2)

使网络驱动器工作但看起来更慢。

而不是那样,我发现创建一个指向真实目录的链接会更好。在Windows中,它是这样的:

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

然后我只是从符号链接目录而不是真实目录中打开项目。

答案 2 :(得分:0)

我设法通过在gradle中更改Dex任务的配置来修复它。 在我们的项目中,我们发现Dex基本上将" preDex"的输出文件作为输入。任务。 由于Dex接受一个文件夹作为输入,覆盖包含该文件夹的jar列表对我们来说是个窍门。

以下是我们在root 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')
  }
}

这个解决方案的缺点是如果你禁用预先解除它会失败,但它可以很容易地适应。

另请注意,您无法搜索" dex"或" prex"直接作为android gradle插件自动将执行的变体添加到任务名称。