Gradle执行dex时出错 命令行太长

5

我正在使用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并将项目映射到磁盘符号,类似的问题可以解决,详情请参见:使用Maven构建Java项目时出现命令行过长的情况

你有什么办法可以使用Gradle解决这个问题吗?


https://code.google.com/p/android/issues/detail?id=60738 似乎是一个已知问题。 - shimi_tap
你有找到解决方法吗? - shimi_tap
请看下面的符号链接。 - Vincent Mimoun-Prat
3个回答

2
我想出了一个解决方法,虽然不完美但至少能够完成工作。
基本上,我所涉及的项目位于一个很长的目录下: 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"

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


0

我通过更改gradle中Dex任务的配置来修复它。

在我们的项目中,我们发现Dex基本上以“preDex”任务的输出文件作为输入。

Dex接受文件夹作为输入,因此用文件夹覆盖jar列表对我们很有帮助。

以下是我们在根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”或“predex”,因为Android Gradle插件会自动将执行的变体添加到任务名称中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接