Gradle Выполнение dex Ошибка командной строки слишком долго

Я создаю приложение для Android на окнах, используя gradle, и когда дело доходит до последнего модуля, я сталкиваюсь со следующей ошибкой:

* 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 путем сопоставления проекта с буквой диска, как описано здесь: Командная строка слишком длинная. В проекте java с maven

Вы знаете, как я могу решить эту проблему с помощью Gradle?

Я понял, обходной путь, это не идеально, но, по крайней мере, выполнять эту работу.

В основном проект, который у меня был, был в длинном каталоге, например: C: \ Development \ cloud \ my.cloud \ main \ mycompany \ android.

Поэтому в качестве обходного пути я сопоставил эту папку с сетевым местоположением, вы можете сделать это, используя команду SUBST MS-DOS или в проводнике под вашим компьютером, используя графический интерфейс «Карта сетевого диска». На самом деле я сопоставил его с буквой Z: и оттуда выполнял команду gradle, и это работало как шарм.

Как я уже сказал, это не идеально, но, по крайней мере, позволило мне двигаться вперед.

Создание сетевого диска работает, но кажется медленнее.

Вместо этого мне было лучше создать ссылку на настоящий каталог. В Windows это выглядит так:

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

Затем я просто открываю проект из символической директории вместо реальной.

Мне удалось исправить это, изменив конфигурацию задачи Dex в градиенте. В нашем проекте мы обнаружили, что Dex в основном принимает входные файлы задачи «preDex». Поскольку Dex принимает папку в качестве входных данных, переопределение списка банок с папкой делало трюк для нас.

Вот код, который мы добавили в 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» или «predex» напрямую, так как плагин android gradle автоматически добавляет вариант выполнения в имя задачи.