С выходом новых версий Android компания Google ужесточает требования к безопасности и функциональности приложений, публикуемых в Google Play. Одно из ключевых требований — использование актуального целевого уровня API. В 2024 году обязательным стал переход на Android 14 (API 34). Для разработчиков на платформе 1С это означает необходимость обновления инструментов разработки и сборки. В процессе этого перехода часто возникают различные ошибки. Разберем по шагам, как подготовить окружение и устранить наиболее распространенные проблемы.
Основная проблема, с которой сталкиваются разработчики, — это использование устаревших версий платформы 1С и сборщика мобильных приложений, которые не поддерживают API 34. Первое сообщение в теме как раз об этом: Google Play прислал предупреждение о необходимости обновиться, а в доступном на тот момент сервисе сборки не было нужной версии.
Ключевое правило успешной сборки: версии всех используемых компонентов должны быть согласованы и поддерживать целевую версию Android. Вам потребуется:
.cf) необходимо использовать Конфигуратор той же версии, что и платформа/сборщик (8.3.24+).Несоблюдение этого правила, особенно пункта о версии Конфигуратора, приводит к первой распространенной ошибке.
Предположим, вы обновили платформу и сборщик до версии 8.3.24, но при попытке сборки получаете ошибку в логах. Проанализируем ситуацию.
Признаки проблемы:
В логе сборки появляется критическая ошибка ([ERR]) со следующим содержанием:
[ERR ] Значение не является значением объектного типа (Use)
Значение не является значением объектного типа (Use)
{CommonModule.MobileCfgsAndAppsServer.Module(961)}: Return rowPermission.Use;
{CommonModule.MobileApplicationBuilding.Module(5819)}: If Not MobileCfgsAndAppsServer.GetConfigurationPermission(item.Key, "AllIncomingShareRequestsTypesProcessing") Then
{CommonModule.MobileApplicationBuilding.Module(5549)}: MakeMobAppIncomingShareFile(LogFile, vtShareFileTypes, Params.ConfigFileNames, Params.ConfigDirectory);
{CommonModule.MobileApplicationBuilding.Module(1101)}: ProcessIncomingShareFileTypes(LogFile, "android", Params);
Также в логе можно найти очень важное предупреждение ([WARN]):
[WARN] Конфигурация была выгружена конфигуратором версии 8.3.23 или предшествующей версией. Рекомендуется обновить конфигурацию на версию, которая выгружена конфигуратором версии 8.3.24 или последующей версии
Причина ошибки:
Ошибка вызвана несоответствием версий. Сборщик, работающий на платформе 8.3.24, пытается найти в файле конфигурации свойство AllIncomingShareRequestsTypesProcessing. Это новое свойство, которое появилось только в версии 8.3.24 и отвечает за возможность приложения обрабатывать запросы "Поделиться" из операционной системы.
Если выгрузка файла конфигурации (.cf) была сделана из Конфигуратора старой версии (например, 8.3.23), то в этом файле просто нет информации о данном свойстве. Сборщик не находит нужный узел в XML-структуре файла, что приводит к падению с ошибкой "Значение не является значением объектного типа".
Решение:
Необходимо обеспечить, чтобы файл мобильной конфигурации был выгружен из Конфигуратора той же версии, что и используемая для сборки платформа.
.cf: Конфигурация -> Выгрузить конфигурацию в файлы... (иногда требуется выполнение произвольного кода в процессе подготовки).После этих действий первая ошибка должна исчезнуть, но может проявиться следующая.
После исправления первой проблемы сборка может продвинуться дальше, но завершиться неудачей на этапе работы с Android SDK. В логе Gradle появляется длинный стек вызовов Java.
Признаки проблемы:
Лог сборки содержит множество предупреждений и в итоге критическую ошибку с таким текстом:
Not a number: 33x: java.lang.NumberFormatException: Not a number: 33x
at com.sun.xml.bind.DatatypeConverterImpl._parseInt(DatatypeConverterImpl.java:125)
at com.sun.xml.bind.v2.model.impl.RuntimeBuiltinLeafInfoImpl$18.parse(RuntimeBuiltinLeafInfoImpl.java:742)
...
at com.android.repository.impl.manager.LocalRepoLoaderImpl.parsePackage(LocalRepoLoaderImpl.java:313)
...
Причина ошибки:
Эта проблема связана с внутренними механизмами сборщика 1С и его взаимодействием с Android SDK. Google изменил формат версионирования в файлах-описаниях пакетов SDK. Если раньше версия была просто числом (например, "33"), то теперь она может содержать расширения (например, "33-ext4"). Старые версии Java-компонентов внутри сборщика 1С не готовы к такому формату. Они пытаются преобразовать строку "33x" или "33-ext4" в число, натыкаются на нечисловые символы и выбрасывают исключение NumberFormatException.
Решение:
Эта проблема была исправлена фирмой "1С" в обновленных версиях сборщика.
Основное решение — обновить сборщик мобильных приложений до версии 8.3.24.49 или выше. В этих версиях исправлен парсер XML-файлов Android SDK, и он корректно обрабатывает новый формат версий.
В качестве временной меры или если обновление невозможно, можно попробовать использовать более старую версию Android SDK (например, API 31), как было предложено на форуме. Однако это не решит основную задачу — сборку под API 34 — и является лишь диагностическим шагом.
Еще одна частая ошибка возникает на финальном этапе сборки — при подписании пакета приложения (APK или AAB), что требует корректной работы с двоичными данными.
Признаки проблемы:
Сборка завершается с ошибкой, в логе которой присутствуют строки:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':packageSignRelease'.
> Multiple task action failures occurred:
> A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable
> com.android.ide.common.signing.KeytoolException: Failed to read key key from store "...\\sign.key": Invalid keystore format
Причина ошибки:
Эта ошибка указывает на то, что Gradle не может прочитать ваш файл хранилища ключей (keystore). Наиболее вероятная причина — несоответствие формата файла ключа и версии Java, используемой для сборки.
JKS (Java KeyStore). Начиная с Java 9, форматом по умолчанию стал PKCS12.PKCS12.Решение:
Необходимо привести в соответствие версию Java и формат ключа.
JKS. При создании нового ключа с помощью утилиты keytool из комплекта JDK явно укажите тип хранилища:
keytool -genkey ... -keystore my-release-key.jks -storetype JKS
Если у вас уже есть ключ в формате PKCS12, его можно конвертировать в JKS.Последовательно решая эти проблемы, вы сможете успешно собрать ваше мобильное приложение 1С в соответствии с последними требованиями Google Play для Android 14.