При разработке мобильных приложений на платформе 1С и последующей сборке их в APK-файл для Android, разработчики могут столкнуться с неочевидными трудностями, особенно когда в проекте используются графические элементы. Одной из таких распространенных проблем является ошибка, связанная с некорректным распознаванием графических файлов формата PNG. Даже если файлы имеют правильное расширение .png и, казалось бы, корректно указываются в проекте, процесс сборки может завершиться с ошибкой, если их внутренний формат не соответствует строгим требованиям инструментов Android.
Рассмотрим ситуацию, когда все графические данные загружаются через архив, в соответствии с инструкциями, и система при этом не выдает никаких ошибок или предупреждений на этапе загрузки или проверки. Однако, как только мы приступаем к сборке приложения, указывая эти графические файлы, процесс прерывается с критической ошибкой, а без графических элементов сборка проходит успешно. Такое поведение указывает на проблему, непосредственно связанную с обработкой изображений на более глубоком уровне.
Когда процесс сборки завершается неудачей, крайне важно внимательно изучить лог ошибок. Часто в таком случае мы увидим сообщение следующего вида:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':mergeSignReleaseResources'.
> Multiple task action failures occurred:
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> Android resource compilation failed
D:\MOBILE_one_C_Prilozenia\OBSYI_KESH\mab-cb8a4783-55f6-4b01-a330-adf62881fe27\res\drawable-ldpi\pushlargeicon.png: AAPT: error: failed to read PNG signature: file does not start with PNG signature.
D:\MOBILE_one_C_Prilozenia\OBSYI_KESH\mab-cb8a4783-55f6-4b01-a330-adf62881fe27\res\drawable-ldpi\pushlargeicon.png: AAPT: error: file failed to compile.
Эта ошибка, повторяющаяся для различных графических файлов в разных директориях плотности экрана (например, drawable-ldpi, drawable-hdpi, drawable-xhdpi), является ключевым указанием на корень проблемы. Обратим внимание на строки:
AAPT: error: failed to read PNG signature: file does not start with PNG signature.AAPT: error: file failed to compile.AAPT (Android Asset Packaging Tool) — это основной инструмент, используемый Android для обработки ресурсов приложения, включая изображения, макеты и строковые ресурсы. AAPT компилирует эти ресурсы в бинарный формат, который затем включается в APK-файл. Сообщение "failed to read PNG signature" означает, что AAPT не смог распознать файл как действительный PNG-файл. Каждый PNG-файл должен начинаться с определенной последовательности байтов, известной как "PNG signature" (обычно это ‰PNG), которая служит своего рода "отпечатком" или "заголовком", однозначно идентифицирующим формат файла. Если эта сигнатура отсутствует или повреждена, AAPT не может правильно интерпретировать содержимое файла, даже если его расширение .png.
Сборщик 1С для мобильных приложений, в свою очередь, использует инфраструктуру Android SDK, включая Gradle (систему автоматизации сборки) и AAPT, для создания конечного APK. Когда AAPT сообщает об ошибке, Gradle перехватывает её и останавливает процесс сборки, выводя соответствующее сообщение в консоль. Таким образом, проблема кроется не в самом сборщике 1С, а в том, как Android SDK обрабатывает предоставленные графические ресурсы.
Давайте разберем, почему файл, который мы считаем PNG, может не быть таковым с точки зрения инструментов Android:
Неправильное сохранение или конвертация: Это наиболее частая причина. Иногда файлы изображений просто переименовываются в .png из другого формата (например, .jpg или .bmp) без фактического изменения их внутреннего содержимого. В результате файл сохраняет структуру старого формата, но получает расширение PNG. AAPT, проверяя сигнатуру, обнаруживает несоответствие.
Кроме того, некоторые программы для редактирования изображений могут сохранять PNG-файлы некорректно, что приводит к отсутствию или повреждению "PNG-сигнатуры".
Повреждение файла: Файл мог быть поврежден при передаче, копировании, архивировании или хранении. Это может произойти из-за сбоев диска, сетевых ошибок или некорректной работы программного обеспечения.
Использование неподходящего программного обеспечения: Некоторые старые или специфические программы могут сохранять PNG-файлы не полностью совместимым способом с актуальными инструментами сборки Android. Стандарты форматов могут обновляться, и старое ПО может не учитывать эти изменения.
Проблемы с цветовым профилем или метаданными: В редких случаях некорректные цветовые профили или избыточные метаданные в изображении могут вызывать проблемы при обработке AAPT, хотя это менее распространено, чем проблемы с сигнатурой.
Для устранения ошибки "failed to read PNG signature" нам необходимо убедиться, что все используемые графические файлы PNG действительно соответствуют стандарту PNG. Рассмотрим пошаговый алгоритм действий.
Откроем в разных редакторах: Попробуйте открыть подозрительный PNG-файл в нескольких надежных графических редакторах, таких как Paint.NET, GIMP, Adobe Photoshop или XnView MP. Если файл не открывается, отображается с ошибками или выглядит искаженным в одном из них, это является явным признаком проблемы.
Проверим сигнатуру вручную (для продвинутых пользователей): Как было упомянуто в обсуждении, действительный PNG-файл начинается с определенной последовательности байтов. Мы можем использовать шестнадцатеричный редактор (например, HxD, Notepad++ с плагином Hex Editor) для открытия файла и проверки его первых байтов. Истинный PNG-фафайл должен начинаться с байтов, соответствующих символам ‰PNG. Если вместо этого мы видим другие символы (например, ÿØÿà для JPEG), это подтверждает, что файл не является настоящим PNG, несмотря на расширение.
Используем онлайн-валидаторы: Существуют онлайн-сервисы и утилиты, позволяющие проверить целостность и корректность PNG-файлов. Загрузка файла на такой сервис поможет получить независимое подтверждение его формата.
Основное и наиболее эффективное решение заключается в том, чтобы заново сохранить проблемные изображения в формате PNG с помощью надежного графического редактора. Это гарантирует, что файл будет создан с корректной PNG-сигнатурой и внутренней структурой.
Используем графический редактор:
pushlargeicon.png, icon.png и pushsmallicon.png, упомянутые в логе ошибок) в одном из проверенных редакторов: Paint.NET, GIMP или Adobe Photoshop.Важно: Проделаем эту операцию со всеми графическими файлами, которые упоминаются в логе ошибок, а в идеале — со всеми графическими активами проекта, чтобы избежать подобных проблем в будущем.
Используем утилиты командной строки (для пакетной обработки): Если у нас много графических файлов, и ручное пересохранение каждого из них нецелесообразно, мы можем воспользоваться утилитами командной строки, такими как ImageMagick. Эта программа позволяет массово конвертировать изображения.
Пример команды для конвертации:
convert input.jpg output.png
Даже если входной файл уже имеет расширение .png, мы можем "переконвертировать" его в PNG, чтобы переписать его с корректной сигнатурой:
convert old_file.png new_file.png
или даже перезаписать исходный файл, если уверены в действиях:
mogrify -format png original_file.png
После конвертации заменяем старые файлы новыми в проекте 1С.
Для Android-приложений также рекомендуется оптимизировать изображения. Это поможет не только в сборке, но и в производительности приложения на устройствах:
Сжатие без потерь (Lossless Compression): Используем инструменты, такие как TinyPNG, ImageOptim или Squoosh, для уменьшения размера PNG-файлов без заметной потери качества. Это снизит размер APK и ускорит загрузку.
Разрешения для разных плотностей экрана: Android поддерживает различные плотности пикселей (dpi), и для оптимального отображения рекомендуется предоставлять изображения в разных разрешениях для соответствующих директорий: drawable-ldpi, drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi и drawable-xxxhdpi. Это не только улучшит внешний вид приложения на разных устройствах, но и предотвратит потенциальные проблемы с масштабированием и потреблением памяти.
Хотя в нашем случае проблема оказалась в формате файлов, несовместимость версий инструментов также является частой причиной ошибок сборки. Мы должны убедиться, что версии Android SDK, Android Studio и сборщика мобильного приложения 1С совместимы друг с другом.
Актуальность сборщика 1С: Используем самый последний сборщик, доступный на ИТС.
Соответствие версий SDK/Studio: Часто 1С не успевает оперативно обновлять свой сборщик под самые свежие версии Android SDK и Studio. Мы должны определить, какие версии Android SDK и Android Studio были актуальны на дату выхода используемого сборщика 1С, и постараться придерживаться именно этих версий. В некоторых случаях может потребоваться установка более старых компонентов SDK через менеджер SDK в Android Studio.
В некоторых случаях проблемы сборки могут быть вызваны поврежденными временными файлами или кэшем. После выполнения вышеописанных шагов, всегда полезно очистить кэш сборки перед повторной попыткой:
В Android Studio или Gradle-проекте это обычно делается командой gradle clean или через меню Build -> Clean Project.
В контексте 1С это может включать очистку временных файлов, связанных со сборкой, или "общего кэша" (как упомянуто в логе OBSYI_KESH), который используется мобильной платформой 1С.
Проблема "failed to read PNG signature" является классическим примером того, как даже, казалось бы, правильное расширение файла не гарантирует его корректность с точки зрения инструментов сборки. Важность строгого соответствия файлов их заявленному формату критична для успешной сборки Android-приложений. Мы выяснили, что основное решение заключается в тщательной проверке и, при необходимости, пересохранении всех графических PNG-файлов с помощью надежных графических редакторов. Этот подход гарантирует, что каждый файл будет иметь необходимую PNG-сигнатуру и будет корректно обработан AAPT, позволяя сборщику 1С успешно создать APK-файл нашего мобильного приложения.