Ошибка «too long to param» при сборке проекта: причины и решение

Ошибка too long to param появляется при сборке Android-проектов в Android Studio или Unity на Windows, когда итоговая командная строка запуска Java-процесса превышает лимит операционной системы. Сообщение означает, что в команду запуска упаковано слишком много параметров — чаще всего это длинные пути к библиотекам, classpath с сотнями jar-файлов или вложенные зависимости проекта.

Проблема напрямую связана с ограничением Windows на длину командной строки (порядка 32 тысяч символов для CreateProcess и заметно меньше — около 8191 символа — для классического cmd.exe). Когда сборщик формирует команду с перечислением всех путей, лимит исчерпывается, и процесс завершается с ошибкой ещё до начала реальной компиляции. Ниже разберём, что именно проверить и как сократить команду без потери функциональности проекта.

Почему возникает ошибка «too long to param»

Основная причина — переполнение командной строки. Сборочные системы (Gradle, внутренние билд-системы Unity) при запуске компилятора или утилит вроде d8/r8 передают им список всех зависимостей одной строкой. Если проект крупный, а пути длинные, строка раздувается до критического размера.

Типичные факторы, усугубляющие ситуацию:

  • 📁 Глубокая вложенность каталогов — проект лежит по пути вида C:\Users\Имя\Documents\Рабочие проекты\...\, и каждый символ пути множится на сотни файлов.
  • 📦 Большое число зависимостей — подключённые SDK, плагины и библиотеки добавляют десятки jar-файлов в classpath.
  • 👤 Длинное имя пользователя Windows — папка профиля входит в пути к кэшу Gradle и SDK.
  • 🔤 Кириллица и пробелы в путях — сами по себе не главный фактор, но увеличивают длину строки и иногда ломают экранирование.

Отдельный сценарий — ошибка CreateProcess error=206 (The filename or extension is too long), которая имеет ту же природу и часто встречается рядом с «too long to param» в логах сборки.

Быстрая диагностика: что проверить в первую очередь

Прежде чем менять конфигурацию, убедитесь, что проблема именно в длине команды, а не в повреждённой зависимости. Откройте полный лог сборки: в Android Studio это вкладка Build, в Unity — файл Editor.log. Найдите строку, которая предшествует ошибке, — обычно там видно, какой инструмент запускался (java, d8, aapt2) и насколько раздут список аргументов.

Проверьте длину базовых путей проекта:

  • 🔍 Путь к корню проекта — чем короче, тем лучше.
  • 🔍 Путь к Android SDK (по умолчанию находится в профиле пользователя).
  • 🔍 Путь к кэшу Gradle (C:\Users\<имя>\.gradle).
📊 Где возникла ошибка «too long to param» у вас?
Android Studio (Gradle-сборка)
Unity (экспорт Android)
Командная строка / CI
Другая среда

Решение 1: сократить пути к проекту и SDK

Самый надёжный способ — физически укоротить пути. Перенесите проект в каталог вроде C:\dev\project, а Android SDK — в C:\Android\Sdk. Это безопасная операция: после перемещения нужно лишь указать новый путь к SDK в настройках среды (File → Project Structure → SDK Location в Android Studio или аналогичный пункт в Unity).

Дополнительно можно перенести кэш Gradle ближе к корню диска, задав переменную окружения:

setx GRADLE_USER_HOME C:\gradle

После изменения переменной перезапустите среду разработки, чтобы она подхватила новое расположение кэша. Учтите, что зависимости будут загружены заново — на это потребуется время и доступ к сети.

☑️ Чек-лист сокращения путей

Выполнено: 0 / 4

Решение 2: включить сокращение командной строки в Gradle

Gradle и плагин Android Gradle умеют передавать classpath не сплошной строкой, а через manifest jar или argument file — специальный файл, на который команда ссылается одним параметром. Это радикально уменьшает длину команды.

В зависимости от версии инструментов поведение различается, поэтому сверяйтесь с документацией к вашей версии Android Gradle Plugin. Общий подход для задач типа JavaExec в build.gradle выглядит так:

tasks.withType(JavaExec).configureEach {

// Сокращение командной строки через manifest jar

// Доступность параметра зависит от версии Gradle

}

⚠️ Внимание: точные имена параметров и их поддержка зависят от версии Gradle и Android Gradle Plugin. Не копируйте конфигурацию из чужих примеров без проверки совместимости — неверный параметр остановит сборку с новой ошибкой.

Решение 3: сократить число зависимостей и включить minify

Если проект оброс библиотеками, часть из них можно убрать или заменить. Проведите ревизию блока dependencies: нередко обнаруживаются неиспользуемые SDK, подключённые «на всякий случай». Каждая удалённая зависимость — это минус несколько путей в командной строке.

Для релизных сборок включение сжатия кода (R8/ProGuard) также уменьшает объём передаваемых данных, хотя это побочный эффект, а не основное назначение инструмента. В build.gradle модуля это выглядит примерно так:

buildTypes {

release {

minifyEnabled true

shrinkResources true

}

}

Почему проблема почти не встречается на macOS и Linux

В Unix-подобных системах лимит на длину аргументов командной строки (ARG_MAX) обычно значительно выше, чем эффективный лимит CreateProcess в Windows. Поэтому один и тот же проект может собираться на macOS без ошибок и падать с «too long to param» на Windows-машине.

Сравнение способов решения

СпособСложностьЭффектРиски
Перенос проекта в короткий путьНизкаяВысокийНужно обновить пути в IDE
Перенос SDK и кэша GradleНизкаяСреднийПовторная загрузка зависимостей
Сокращение командной строки в GradleСредняяВысокийЗависит от версии плагина
Чистка зависимостейСредняяСреднийРиск удалить нужную библиотеку
Обновление AGP и GradleНизкаяРазныйВозможны несовместимости плагинов
⚠️ Внимание: не пытайтесь «обойти» лимит, разбивая сборку вручную через bat-файлы или правя системные ограничения Windows — это хрупкие решения, которые ломаются при первом обновлении инструментов.

Когда ничего не помогает

Если пути уже короткие, а ошибка сохраняется, возможная причина — устаревшие версии инструментов. Обновите Android Gradle Plugin и Gradle до актуальных стабильных версий: в новых выпусках механизм передачи аргументов неоднократно дорабатывался. Проверьте также, не генерирует ли какой-то сторонний плагин сборки собственные длинные команды — это видно в полном логе.

В корпоративных CI-системах полезно запускать сборку из короткого рабочего каталога агента (например, C:\b\p), а не из вложенных папок профиля. Принцип тот же: каждый сэкономленный символ базового пути сокращает итоговую команду на сотни символов суммарно.

Частые вопросы

Ошибка возникает только на одном компьютере — почему?

Наиболее вероятная причина — разная длина путей: на одной машине проект и SDK лежат в коротких каталогах, на другой — глубоко в профиле пользователя с длинным именем. Сравните пути к проекту, SDK и кэшу Gradle на обеих системах.

Поможет ли переустановка Android Studio?

Сама по себе — нет, потому что проблема в длине командной строки, а не в повреждении программы. Переустановка поможет лишь косвенно, если заодно вы разместите SDK в более коротком пути.

Связана ли ошибка с «CreateProcess error=206»?

Да, это проявления одной проблемы: Windows не может запустить процесс, потому что командная строка или путь к файлу превышают допустимую длину. Способы решения одинаковые.

Влияют ли кириллические символы в пути на эту ошибку?

Кириллица увеличивает длину строки и иногда вызывает отдельные проблемы с кодировкой в инструментах сборки. Рекомендуется держать проект и SDK в путях только из латинских символов без пробелов.

Можно ли решить проблему без переноса проекта?

Частично — через перенос кэша Gradle и SDK, сокращение зависимостей и механизмы сжатия classpath в Gradle. Но перенос проекта в короткий путь остаётся самым простым и надёжным шагом.