«Реактивный подход и мощные инструменты»: как Jetpack Compose помогает разработчикам Android-приложений

15.07.24, Пн, 10:24, Мск,

Евгений Пономарёв, старший разработчик в UMI Technologies Corp., поведал об особенностях подхода к проектированию UX/UI для Android-приложений. Он поделился способами оптимизации памяти, загрузки видео и изображений, рассказал, как отслеживать производительность приложения и есть ли преимущества у Jetpack Compose перед XML. Профессиональный опыт эксперта включает разработку передового кредитного приложения, позволяющего пользователям беспрепятственно финансировать покупки.

Содержание

Основная статья: Разработчики ПО в России

Jetpack Compose VS XML

Евгений Пономарёв, эксперт по разработке UI для Android-приложений

Перед традиционным XML Jetpack Compose имеет целый ряд преимуществ, и в их числе – упрощение структуры кода. В нем весь UI-код сосредоточен в одном месте, что делает его более читаемым и поддерживаемым. Таким образом, отпадает необходимость в синхронизации XML-файлов с кодом активности или фрагмента. Jetpack Compose предоставляет мощные инструменты, такие как Modifier, и они позволяют легко управлять внешним видом, поведением компонентов без необходимости сложной верстки. Стоит отметить и реактивный подход – состояние UI динамически обновляется при изменении данных. Это упрощает работу с пользовательскими действиями: фильтры, обновление данных, выбор элементов.

Недостаток у Jetpack Compose тоже есть – нестабильность. Это новая технология, которая пока развивается, поэтому некоторые компоненты и библиотеки могут работать попеременно, либо быть еще недостаточно оптимизированными.

По производительности Jetpack Compose в некоторых случаях уступает традиционному подходу, особенно в приложениях с высокой сложностью UI или большими объемами данных, считает Евгений Пономарёв. Он активно взаимодействует с Jetpack Compose и использовал его в нескольких своих проектах, в том числе в работе над кредитным приложением в компании UMI Technologies Corp. В свое время он стал настоящей революцией в подходе к разработке UI для Android-приложений благодаря декларативным принципам – они существенно упрощают создание сложных пользовательских интерфейсов.

«
«Пример моей работы с Jetpack Compose – кредитный калькулятор в UMI Credit, один из наиболее сложных разделов приложения. Он требовал непростой логики и динамического обновления интерфейса. Именно в Compose я смог создать реактивные списки предложений от банков, которые обновляются в реальном времени, а также интуитивно понятный интерфейс с динамическими графиками платежей и подсказками. Разработал также адаптивный UI, который корректно отображается на экранах разных размеров», – рассказывает Евгений Пономарёв, уточняя, что Jetpack Compose позволил сократить время разработки и повысить UX за счет простоты и удобства работы с компонентами.
»

В процессе, вспоминает разработчик, приходилось сталкиваться с нестабильностью некоторых библиотек, с багами в разных версиях. Это потребовало детального анализа и поиска обходных решений. Однако, несмотря на недостатки, Евгений Пономарёв считает Jetpack Compose мощным инструментом для создания современных Android-приложений и уверен, что со временем эта технология будет более стабильной и надежной, а ее использование станет стандартом в разработке.

Нюансы проектирования UX/UI для Android-приложений

Работа над проектированием начинается с получения дизайна в Figma. Далее анализируются макеты и появляется понимание того, какие элементы интерфейса можно реализовать с использованием стандартных компонентов Android, а какие требуют создания кастомных View.

«
«Мой подход к проектированию можно разделить на несколько этапов. Первый этап – планирование, когда я разбиваю интерфейс на небольшие части, чтобы выделить повторяющиеся элементы и оптимизировать их применение. Второй этап – реализация стандартных элементов: я использую UI-компоненты из Material Design (TextField, Button, Card), что ускоряет процесс разработки и делает интерфейс более консистентным. Третий этап – создание кастомных элементов», – отмечает Евгений Пономарёв. Для сложных интерфейсов в Jetpack Compose он разрабатывает кастомные View или их аналоги, чтобы максимально соответствовать дизайну – например, графики, анимации или сложные карточки. Далее начинается процесс тестирования.
»

Для создания удобных и интуитивно понятных интерфейсов желательно следовать гайдлайнам Material Design. Можно использовать TextField и Button, можно кастомизировать эти стандартные элементы так, чтобы они соответствовали уникальному стилю и требованиям продукта. Чтобы интерфейс оставался удобным как на смартфонах с маленькими экранами, так и на планшетах или устройствах с нестандартным разрешением, рекомендуется придерживаться принципов адаптивного дизайна.

«
«Мы активно кастомизируем элементы, однако я постоянно слежу за развитием Material Design, поскольку он задает стандарт не только для мобильных приложений, но и для самой операционной системы Android», – говорит Евгений Пономарёв и приводит в пример Google: он активно внедряет Material Design в свои продукты, что делает его обязательным для актуального и конкурентного интерфейса.
»

Когда цель – оптимальный UX

Разработчикам нередко приходится внедрять в UI нестандартные решения для достижения оптимального UX. С такими ситуациями Евгений сталкивался при работе над кредитным калькулятором. Было необходимо, чтобы отображалась динамически обновляемая информация о сумме кредита, графиках платежей и дополнительных услугах. Одной из ключевых сложностей было создание интерфейса, который показывал бы изменения в режиме реального времени по мере изменения параметров и при этом оставался интуитивно понятным для пользователей, работал быстро и без задержек, несмотря на сложные вычисления.

Для создания интерфейса с реактивным обновлением использовался все тот же Jetpack Compose. Каждое изменение параметров (например, суммы кредита или срока) сразу отображалось в UI, то есть, исключалась необходимость нажимать дополнительные кнопки. Для улучшения понимания были добавлены всплывающие подсказки и пояснения – они отображались при наведении или нажатии на элементы интерфейса. Чтобы избежать задержек при сложных расчетах, вычисления перенесли в отдельный поток, и это обеспечило плавную работу интерфейса.

Оптимизация загрузки ресурсов и памяти в Android-приложениях

В числе методов, которые предотвращают замедления и зависания приложений – кэширование данных. Они, включая изображения, хранятся в локальной базе, что позволяет минимизировать количество сетевых запросов. Используется и асинхронная загрузка. Например, Евгений Пономарёв для всех операций применяет Coroutines, чтобы не блокировать основной поток UI. Это позволяет избежать зависаний интерфейса даже при взаимодействии с большими объемами данных, как объясняет разработчик.

Не менее эффективный подход – сжатие изображений перед отправкой или сохранением для уменьшения размера. Это помогает сократить время загрузки и объем передаваемых данных без заметного снижения качества.

Что касается оптимизации памяти, то в приложениях, написанных с использованием Jetpack Compose, это особенно важно, поскольку в них подход к управлению состоянием и ресурсами отличается от классической архитектуры с Activity и Fragment. Применяется несколько подходов, среди них – правильное управление состоянием. Для хранения UI-состояния можно использовать State и MutableState. Это станет гарантией того, что данные будут уничтожены вместе с Composable-функцией. Также желательно минимизировать тяжелые вычисления – для сложных операций или загрузки данных можно использовать LaunchedEffect или side-effect APIs (например, produceState). В этом случае вычисления только тогда, когда это действительно необходимо.

«
«В Jetpack Compose нет строгой привязки к жизненному циклу, как в Activity. Поэтому я слежу за тем, чтобы все тяжелые ресурсы, такие как базы данных или файловые дескрипторы, закрывались вручную, когда они становятся не нужны», – объясняет Евгений Пономарёв.
»

Он отмечает, что регулярно измеряет и отслеживает ключевые метрики – потребление памяти, время отклика и уровень ошибок. Также приходится постоянно отслеживать и количество ошибок и сбоев приложения через Firebase Crashlytics, чтобы обеспечить стабильную работу для всех пользователей. Это, как подчеркивает разработчик, помогает не только оперативно выявлять проблемы, но и оптимизировать работу приложения для пользователей.

Как обеспечить безопасность приложения

В проекте по созданию кредитного приложения Евгений Пономарёв с командой реализовали несколько версий системы авторизации, постоянно улучшая ее для обеспечения безопасности данных и повышения удобства для пользователей. На начальном этапе авторизация была реализована через логин и пароль, но уже в процессе работы стало понятно – такой подход не совсем удобен для пользователей. В итоге логин и пароль были заменены на авторизацию через номер телефона и одноразовый код (OTP) – для пользователей это оказалось проще, поскольку они получили постоянный доступ к своему номеру телефона. А еще это гораздо безопаснее: OTP используется только один раз и имеет ограниченное время действия.

Есть и дополнительные методы авторизации, например, PIN-код – возможность устанавливать его была добавлена для удобства пользователей, чтобы они могли входить в приложение и не вводить повторно ОТР. Реализован также и вход через отпечаток пальца – данные биометрии хранятся и обрабатываются только на устройстве пользователя, и это исключает их компрометацию.

Нет предела совершенству, или как повысить рейтинг приложения

Наиболее красноречивая и объективная оценка удобства приложения – это его рейтинг в Google Play. 4,5 – оптимальный результат, а вот если пользователи ставят ему «тройки» и «двойки», значит, пора бить тревогу, то есть, разбираться, что с приложением не так.

«
«Основное внимание я бы уделил анализу причин низкого рейтинга и планомерному внедрению улучшений, разработал стратегию, охватывающую улучшение UX, производительности и стабильности», – отмечает Евгений Пономарёв.
»

Он предлагает начинать работу над ошибками с анализа отзывов пользователей – это позволяет понять основные проблемы, причины недовольства. Жалобы необходимо классифицировать по категориям – UX, производительность, стабильность. Далее можно определять приоритетные области, требующие улучшений в первую очередь. В рамках отслеживания метрик можно использовать инструменты для мониторинга и устранения сбоев – например, Firebase Crashlytic. Также необходимо измерить задержки в интерфейсе, чтобы обеспечить быстрый отклик приложения.

«
«Я бы отслеживал, сколько пользователей возвращаются в приложение после первой установки, чтобы понять их удовлетворенность. Поработал бы и с обратной связью, внедрив соответствующую систему внутри приложения – для того, чтобы пользователи могли сообщать о проблемах напрямую, не оставляя отрицательных отзывов в Google Play», – рассуждает Евгений Пономарёв.
»

Разработчик советует регулярно отвечать на отзывы в Google Play, тем самым показывая пользователям, что их мнение важно. Оптимальный вариант – реализовать всплывающее окно с просьбой оценить приложение после положительного опыта – например, успешной транзакции или завершения ключевого действия. Таким образом, если пользователь доволен, он может оставить отзыв в Google Play, а если недоволен – сообщить о проблеме через форму обратной связи внутри приложения.


Автор: Анатолий Добронравов