Сборка мобильного приложения на платформе 1С — это сложный технологический процесс, задействующий целую экосистему инструментов: Java Development Kit (JDK), Android SDK, Gradle и непосредственно сам Сборщик мобильных приложений 1С. Ошибки на любом из этапов могут поставить разработчика в тупик, особенно когда логи указывают на низкоуровневые сбои в работе виртуальной машины Java или процесса упаковки ресурсов.
В этой статье мы подробно проанализируем ситуацию, когда сборка прерывается с ошибками Execution of compression failed и Could not reserve enough space for object heap. Мы разберем причины их возникновения и составим пошаговый план настройки окружения для стабильной работы платформы 8.3.15 и выше.
Рассмотрим лог первой неудачной попытки сборки. Процесс доходит до этапа :packageRelease, после чего возникает исключение:
> Task :packageRelease FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':packageRelease'.
> Execution of compression failed.
Проанализируем ситуацию. Данная ошибка на этапе упаковки чаще всего связана с работой инструмента AAPT2 (Android Asset Packaging Tool). Рассмотрим основные причины, по которым это происходит:
MAX_PATH в 260 символов. Сборщик 1С создает временные папки с очень глубокой вложенностью (например, в каталоге build/intermediates/...). Если ваш рабочий каталог сборки находится глубоко в профиле пользователя или на сетевом диске, общая длина пути может превысить лимит, что приведет к сбою сжатия финального .apk файла..zip архивов внутри структуры Gradle.Для решения этой проблемы мы рекомендуем перенести Рабочий каталог (и кеш) максимально близко к корню диска, например, в C:\m1c_build. Это сократит длину путей и уменьшит вероятность ошибок файловой системы.
После очистки кеша пользователь столкнулся с еще более специфичной ошибкой, которая прямо указывает на конфигурацию Java Virtual Machine (JVM):
Error occurred during initialization of VM
Could not reserve enough space for 1572864KB object heap
Выясним причину этого поведения. Значение 1572864KB — это ровно 1.5 ГБ. В настройках сборщика 1С для Gradle часто устанавливается лимит используемой памяти (в нашем случае это было 1 536 Mb). Проблема заключается в том, что автор использовал 32-битную версию JDK (архитектура Java: 32 в логе).
В 32-битных системах Windows (и для 32-битных процессов в 64-битных ОС) адресное пространство ограничено 2 ГБ. Из-за фрагментации памяти операционная система практически никогда не может выделить один непрерывный блок объемом 1.5 ГБ под нужды виртуальной машины Java. Именно поэтому JVM не может стартовать и "зарезервировать" нужное пространство.
Важное правило: Для сборки современных мобильных приложений на базе Android SDK (API 28 и выше) использование 64-битной Java является обязательным требованием.
Рассмотрим этапы настройки системы, которые помогли решить проблему и обеспечат стабильную сборку в будущем.
Первым делом нам необходимо полностью избавиться от 32-битных версий JDK, если мы работаем на 64-битной Windows. Проанализируем действия:
jdk-8u251-windows-x64).C:\Program Files\Java\jdk1.8.0_221.JAVA_HOME должна ссылаться на новую папку, а в переменной Path путь к папке bin новой JDK должен стоять выше любых других упоминаний Java.Иногда компоненты Android SDK могут установиться некорректно или содержать конфликтующие версии Build Tools. Мы рекомендуем выполнить следующие действия:
28.0.3. Если установлены более новые версии (например, 30.x.x), 1С может работать с ними нестабильно из-за различий в скриптах Gradle.В приведенном логе мы видим огромное количество внешних компонент: vtk1f_22_1CInt, ru_atol_drivers_fptr_1c, com_shtrih_jpos1c и другие. Каждая такая компонента — это отдельный набор библиотек (.jar и .so файлов).
Проанализируем риски: разные компоненты могут содержать внутри себя одинаковые библиотеки разных версий (например, support-v4). При сборке Gradle пытается объединить их, и если версии конфликтуют, возникает ошибка на этапе transformResourcesWithMergeJavaResForRelease или упаковки. Если после обновления Java ошибки сохранятся, попробуйте отключать компоненты по одной, чтобы выявить "конфликтную" библиотеку.
Интересным нюансом является влияние сетевого окружения. При первой сборке (или после чистки кеша) Gradle пытается загрузить зависимости из репозиториев Google и Maven. Если у вас активно VPN-соединение, это может привести к двум проблемам:
.aar файлы и сборка "зависает" или падает с ошибкой тайм-аута.PKIX path building failed.Если вы столкнулись с проблемой сертификатов, воспользуйтесь утилитой keytool для добавления нужного сертификата в хранилище доверенных сертификатов Java (cacerts). Пример команды для анализа хранилища:
keytool -list -keystore "C:\Program Files\Java\jdk1.8.0_221\jre\lib\security\cacerts"
После выполнения всех шагов — установки JDK x64, переустановки Android SDK и настройки путей — сборка должна проходить успешно. Мы выяснили, что основной причиной большинства проблем со сборщиком 1С является несоответствие архитектуры Java и попытка выделить большой объем памяти в ограниченном 32-битном пространстве.
Для надежной работы всегда придерживайтесь следующих правил: