При разработке и тиражировании мобильных решений на платформе 1С программисты часто сталкиваются с трудностями на этапе финальной сборки пакета (APK или сообщений для iOS). Одной из самых коварных ошибок является сбой при выполнении задачи :processSignReleaseMainManifest. Эта проблема может поставить в тупик даже опытного разработчика, так как текст ошибки указывает на внутренние механизмы Java, которые, казалось бы, не имеют прямого отношения к коду 1С.
В данной статье мы подробно разберем, почему возникает эта ошибка, как версия JDK влияет на стабильность сборщика и какие практические шаги помогут успешно собрать мобильное приложение.
Рассмотрим типовой сценарий. Разработчик использует «Сборщик мобильных приложений» версии 8.3.21.41, установлены Android SDK 31 или 33, а в качестве среды исполнения выбрана JDK 18.0.2.1. При попытке генерации релизного файла система выдает следующее сообщение:
FAILURE: Build failed with an exception.
Execution failed for task ':processSignReleaseMainManifest'.
> Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to unnamed module @9e357c3
Проанализируем ситуацию: корень проблемы кроется в системе модулей Java (Project Jigsaw), которая была введена еще в Java 9, но стала максимально строгой в версиях 16 и выше. Ошибка говорит о том, что инструменты сборки (Gradle и его плагины), используемые платформой 1С, пытаются получить доступ к защищенным полям системного класса java.io.File через рефлексию. Начиная с Java 17 и 18, такие операции запрещены по умолчанию для обеспечения безопасности и целостности среды.
Первое, на что мы должны обратить внимание — это совместимость компонентов. Для версий платформы 1С 8.3.21 и ниже использование JDK 18 является избыточным и часто вредным. Официально рекомендуемой и наиболее стабильной версией для сборки мобильных приложений 1С остается JDK 11.
Выясним, почему это важно. JDK 11 (LTS-версия) обладает необходимой гибкостью и позволяет инструментам Gradle выполнять операции рефлексии, которые требуются плагинам Android для обработки манифеста приложения. Рассмотрим алгоритм действий по исправлению:
JAVA_HOME, она также должна указывать на версию 11.Если по каким-то причинам переход на JDK 11 невозможен, проанализируем способ «обхода» ограничений безопасности Java 18. Мы можем явно разрешить доступ к модулям, на которые жалуется сборщик. Для этого используются специальные параметры запуска JVM.
Посмотрим на пример параметров, которые необходимо добавить в настройки сборки (через переменные окружения GRADLE_OPTS):
--add-opens=java.base/java.io=ALL-UNNAMED
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.util=ALL-UNNAMED
Эти флаги заставляют виртуальную машину Java «открыть» внутренние пакеты для неименованных модулей (в данном случае — для Gradle). Это должно устранить ошибку Unable to make field... accessible.
Как показывает практика и опыт участников обсуждения, даже после исправления проблем с JDK сборка может прерываться на этапе processSignReleaseMainManifest. Это происходит потому, что на данном этапе Gradle не только проверяет структуру AndroidManifest.xml, но и подготавливает данные для подписи приложения.
Разберем по шагам дополнительные действия, которые помогли решить проблему в реальном кейсе:
build-tools и библиотеки проверки подписей.Часто после неудачных попыток в системе остаются «хвосты», которые мешают новой сборке даже после исправления всех настроек. Проанализируем ситуацию с кэшированием. Мы рекомендуем выполнить следующие действия перед финальной попыткой:
build внутри рабочего каталога вашего проекта мобильного приложения.C:\Users\ИмяПользователя\.gradle\caches.Подводя итог, можно сказать, что стабильная сборка мобильного приложения 1С — это результат баланса между версией платформы 1С, версией JDK (лучше использовать 11) и стабильным доступом к серверам Google. Совместное применение правильной версии Java, использование VPN и обновление ключей разработчика гарантирует успешное завершение процесса создания мобильного решения.