Ошибка 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).
Решение 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
После изменения переменной перезапустите среду разработки, чтобы она подхватила новое расположение кэша. Учтите, что зависимости будут загружены заново — на это потребуется время и доступ к сети.
☑️ Чек-лист сокращения путей
Решение 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. Но перенос проекта в короткий путь остаётся самым простым и надёжным шагом.