Сборка мобильного приложения на платформе 1С — процесс технически сложный, зависящий от множества внешних компонентов: Android SDK, JDK и системы автоматизации сборки Gradle. Часто разработчики сталкиваются с ситуацией, когда процесс сборки «зависает» на этапе ARM или прерывается с ошибками инициализации виртуальной машины Java (JVM). В этой статье мы подробно разберем, как правильно настроить окружение, распределить оперативную память и устранить типичные ошибки манифеста.
Одной из наиболее распространенных причин зависания сборки является ограничение объема оперативной памяти, выделяемой для Gradle daemon. В журнале сборки это часто отражается сообщением: To run dex in process, the Gradle daemon needs a larger heap. Если системе не хватает выделенного объема, процесс либо бесконечно «свопится» (использует файл подкачки), либо просто останавливается без явного уведомления в консоли.
Проанализируем, как управлять этим параметром. В составе сборщика мобильных приложений 1С предусмотрены настройки для передачи аргументов в JVM. Нам необходимо найти параметр org.gradle.jvmargs. Рассмотрим, какие значения следует устанавливать в зависимости от разрядности вашей системы и платформы:
-Xmx1536M или -Xmx2048M. Установка более 3 ГБ на 32-битных системах может привести к невозможности запуска процесса из-за фрагментации адресного пространства.-Xmx4000M или даже -Xmx6000M, если позволяет объем физической оперативной памяти (например, если у вас 12 ГБ и более).Пример настройки в конфигураторе (в окне сборщика):
org.gradle.jvmargs=-Xmx2048M
Часто ошибка Could not reserve enough space for object heap возникает из-за использования 32-битной версии Java Development Kit (JDK) на 64-битной операционной системе. 32-битный процесс Java не может выделить непрерывный блок памяти объемом более 1.2–1.5 ГБ. Если ваша сборка требует большего, она неизбежно упадет.
Выполним следующие шаги для оптимизации окружения:
C:\Program Files\Java\jdk1.8.0 лучше использовать путь вида C:\Java\jdk1.8.0.Иногда сборка останавливается из-за синтаксических или логических ошибок в файле манифеста. Типичная ошибка: There should only be a single uses-sdk element in the manifest. Это означает, что в результирующем файле AndroidManifest.xml тег <uses-sdk> продублирован.
Выясним причину этого поведения. Это происходит, когда настройки минимальной и целевой версии Android указаны одновременно в нескольких местах:
Чтобы решить проблему, проанализируем файл манифеста, который создается в папке Temp во время сборки. Нам нужно убедиться, что тег выглядит единообразно:
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" />
Если вы видите два таких тега, необходимо проверить настройки в 1С и убедиться, что вы не переопределяете эти параметры вручную в дополнительных файлах манифеста, если они используются в проекте.
Версия инструментов сборки (Build-Tools) должна соответствовать версии мобильной платформы. Для платформы 8.3.12 и API Level 28 оптимально использовать Build-Tools версии 28.0.3 или 27.0.3. Использование слишком новых версий (например, 30+) может привести к тому, что Gradle-скрипты, генерируемые 1С, станут невалидными.
Также важно следить за состоянием кэша. Если сборка один раз прервалась аварийно, в папке профиля пользователя (C:\Users\ИмяПользователя\.gradle) могут остаться поврежденные файлы. Рекомендуем перед каждой «чистой» сборкой удалять содержимое этой папки, а также очищать временную папку Temp, указанную в настройках 1С.
Если настройки внутри 1С не помогают, попробуем задать параметры памяти на уровне всей операционной системы через переменные окружения. Это заставит любые процессы Java следовать заданным лимитам.
_JAVA_OPTIONS-Xmx2048MВажно: Это значение должно быть согласовано с разрядностью установленной JDK. Если вы установили 64-битную версию, можно смело ставить -Xmx4G.
org.gradle.jvmargs=-Xmx2048M (или выше)..gradle и Temp.Соблюдение этих шагов позволяет избежать «черного окна» зависания и успешно получить заветный APK-файл для установки на мобильные устройства.