Всем привет, я хотел бы поделиться с вами тем, как создавать приложения для Android с учетом последних тенденций 2023 года.
Отказ от ответственности
Это статья основана на моем мнении и профессиональном опыте, с учетом различных мнений сообщества разработчиков Android, а также с постоянным обзором руководств, предоставляемых Google для Android.
Я должен прояснить, что есть очень интересные инструменты, шаблоны и архитектуры, которые я могу не упоминать, но это не значит, что они не могут быть другими интересными альтернативами для разработки приложений для Android.
Что такое Android?
Android — это операционная система с открытым исходным кодом, основанная на ядре Linux и разработанная Google. Он используется в самых разных устройствах, включая смартфоны, планшеты, телевизоры и смарт-часы.
В настоящее время Android является самой используемой в мире операционной системой для мобильных устройств. Согласно отчету Statcounter, за последние 12 месяцев доля Android на рынке составляет 71.96%.
Далее я упомяну список инструментов, библиотек, архитектур, руководств и других утилит, которые я считаю важными для создания современных приложений для Android.
Kotlin
Kotlin — это язык программирования, разработанный JetBrains. Рекомендован Google, который официально объявил об этом в мае 2017 года. Это современный язык программирования, который совместим с Java и может работать на JVM, что сделало его внедрение в разработку приложений для Android очень быстрым.
Независимо от того, новичок вы в Android или нет, вы должны рассматривать Kotlin в качестве своего основного языка программирования, не плывите против течения. Сам Google объявил об этом подходе на I/O 2019. С Kotlin вы сможете использовать все особенности современного языка, в том числе мощь кортуин и библиотек, разработанных для экосистемы Android.
Официальная документация Kotlin здесь.
Jetpack Compose
Jetpack Compose — это рекомендуемый современный набор инструментов для создания нативного пользовательского интерфейса. Он упрощает и ускоряет разработку UI для Android.
Jetpack Compose является частью библиотеки Android Jetpack и использует язык программирования Kotlin для простого создания нативного пользовательского интерфейса. Кроме того, он интегрируется с другими библиотеками Android Jetpack, такими как LiveData и ViewModel, чтобы упростить создание реактивных и поддерживаемых Android-приложений.
Некоторые ключевые особенности Jetpack Compose:
- Декларативный интерфейс.
- Настраиваемые виджеты.
- Простая интеграция с существующим кодом.
- Предварительный просмотр в реальном времени.
- Улучшенная производительность.
Ресурсы:
- Официальная документация
- Карта совместимости Compose и Kotlin
- Jetpack Compose Roadmap
- Обучающий курс Jetpack Compose
- Материалы по Jetpack Compose
Android Jetpack
Jetpack — это набор библиотек, которые помогают разработчикам следовать передовым методам, сокращать шаблонный код и писать код, который работает одинаково на всех версиях и устройствах Android, чтобы разработчики могли сосредоточиться на том, что им интересно.
Некоторые из наиболее распространенных инструментов:
Material Design
Material Design — это адаптируемая система руководств, компонентов и инструментов, поддерживающая лучшие практики проектирования пользовательского интерфейса. Благодаря открытому исходному коду, Material Design упрощает сотрудничество между дизайнерами и разработчиками и помогает командам быстро создавать красивые продукты.
Material Design поддерживается дизайнерами и разработчиками из Google и позволяет получить единое руководство по работе с UI/UX для Android, Flutter и Web.
В настоящее время последней версией для Material Design является третья, вы можете увидеть больше здесь
Чистая архитектура
Концепция «чистой архитектуры» была представлена Робертом С. Мартином. Она основана на разделении ответственности за счет разделения кода на слои.
Характеристики чистой архитектуры:
- Независимость от фреймворков
- Тестируемая
- Независимость от пользовательского интерфейса
- Независимость от базы данных
- Независимость от каких-либо внешних агентов
Правило зависимостей
Правило зависимости очень хорошо описано автором в статье The Clean Code Blog:
Основное правило, благодаря которому эта архитектура работает, называется правилом зависимостей. Это правило гласит, что зависимости исходного кода могут указывать только внутрь. Ничто во внутреннем круге не может вообще ничего знать о чем-то во внешнем круге. В частности, имя чего-либо, объявленного во внешнем круге, не должно упоминаться в коде во внутреннем круге. Это включает в себя функции, классы, переменные или любой другой именованный программный объект.
Блог о чистом коде вы можете найти тут.
Чистая архитектура в Android:
- Представление: Activities, Fragments, View Model и другие компоненты представления.
- Домен: Use Cases, Entities, Repositories и другие компоненты домена.
- Данные: реализации Repository, мапперы, DTO и т.д.
Архитектурные паттерны для уровня представления
Архитектурный шаблон — это стратегия более высокого уровня, направленная на помощь в проектировании архитектуры программного обеспечения и характеризующаяся тем, что она представляет собой решение для общих архитектурных проблем в виде многократно используемого фреймворка. Архитектурные шаблоны похожи на шаблоны проектирования, но они крупнее по масштабу и решают более глобальные проблемы, такие как общая структура системы, отношения между компонентами и способ управления данными.
На уровне представления у нас есть несколько архитектурных шаблонов, из которых я хотел бы выделить следующие:
- MVVM
- MVI
Я не хочу вдаваться в объяснения каждого из них, потому что в Интернете вы и так найдете слишком много информации об этом.
Кроме того, вы также можете ознакомиться с официальным руководством по архитектуре приложения.
Внедрение зависимостей
Внедрение зависимостей — это шаблон проектирования программного обеспечения, который позволяет клиенту получать свои зависимости из внешнего источника, а не создавать их самостоятельно. Это метод достижения инверсии управления (IoC) между объектами и их зависимостями.
Модульность
Модуляризация — это метод проектирования программного обеспечения, который позволяет разделить приложение на независимые модули, каждый со своей функциональностью и ответственностью.
Преимущества модульности:
- Возможность повторного использования: имея независимые модули, их можно повторно использовать в разных частях приложения или даже в других приложениях.
- Строгий контроль видимости: модули позволяют вам легко контролировать то, что вы предоставляете другим частям вашей кодовой базы.
- Настраиваемая доставка: Play Feature Delivery использует расширенные возможности пакетов приложений, позволяя вам предоставлять определенные функции вашего приложения на условиях или по запросу.
- Масштабируемость: наличие независимых модулей позволяет добавлять или удалять функциональные возможности, не затрагивая другие части приложения.
- Простота обслуживания: разделение приложения на независимые модули, каждый из которых имеет свою функциональность и ответственность, упрощает понимание и поддержку кода.
- Простота тестирования: имея независимые модули, их можно тестировать изолированно, что упрощает обнаружение и исправление ошибок.
- Улучшение архитектуры: модульность помогает улучшить архитектуру приложения, обеспечивая лучшую организацию и структуру кода.
- Улучшение совместной работы: имея независимые модули, разработчики могут работать над разными частями приложения одновременно и без помех.
- Время сборки: некоторые функции Gradle, такие как инкрементная сборка, кеш сборки или параллельная сборка, могут использовать модульность для повышения производительности сборки.
Подробнее см. в официальном руководстве.
Сеть
Сериализация
В этом разделе я хотел бы упомянуть два важных, на мой взгляд, инструмента: Moshi, широко используемый совместно с Retrofit, и Kotlin Serialization, ставка команды Kotlin в Jetbrain.
Moshi и Kotlin Serialization — это две библиотеки сериализации/десериализации для Kotlin и Java, которые позволяют преобразовывать объекты в JSON или другой формат сериализации и наоборот. Оба обеспечивают удобный интерфейс, оптимизированный для использования в мобильных и десктопных приложениях. Moshi в первую очередь фокусируется на сериализации JSON, а Kotlin Serialization поддерживает различные форматы сериализации, включая JSON.
Загрузка изображения
Для загрузки изображения из Интернета доступно несколько сторонних библиотек, которые помогут вам справиться с этим процессом. Библиотеки загрузки изображений делают за вас большую часть тяжелой работы. Они обрабатывают как кэширование (так что вы не загружаете изображение несколько раз), так и сетевую логику для загрузки изображения и его отображения на экране.
Реактивность/управление потоками
Когда мы говорим о реактивном программировании и асинхронных процессах, наш первый вариант — это Kotlin Coroutines. Благодаря Suspension Functions и Flow мы можем удовлетворить все эти потребности. Однако я считаю, что в этом разделе стоит подчеркнуть важность RxJava в разработке приложений для Android. Для тех из вас, кто работает с Android всего пару лет, можно сказать, что RxJava — это очень мощный инструмент с очень большим набором функций для работы с потоками данных. Я по-прежнему считаю RxJava интересной альтернативой для реактивности сегодня.
Локальное хранение данных
Важным моментом при создании мобильных приложений является возможность локального сохранения данных, например, некоторых данных сеанса или данных кэша. Важно выбрать правильный вариант хранения, исходя из потребностей вашего приложения. Мы можем хранить неструктурированные данные, такие как ключ-значение, или структурированные данные, такие как таблицы в базе данных. Имейте в виду, что в этом пункте упоминаются не все типы локального хранилища, которые у нас есть (например, хранилище файлов), а только инструменты, которые позволяют нам сохранять данные.
Предложения:
Тестирование
Оптимизация R8
R8 — это компилятор по умолчанию, который преобразует Java байт-код вашего проекта в формат DEX, который работает на платформе Android. Это инструмент, который помогает нам обфусцировать и сокращать код приложения, сокращая имена классов и их свойств, удаляя неиспользуемый код и ресурсы внутри проекта. Чтобы узнать больше, ознакомьтесь с документацией Android о сжатии, обфускации и оптимизации вашего приложения.
Play Feature Delivery
Модель обслуживания приложений Google Play, называемая динамической доставкой, использует Android App Bundle для создания и обслуживания оптимизированных APK-файлов для каждой конфигурации устройства пользователя, поэтому пользователи загружают только тот код и ресурсы, которые им нужны для запуска вашего приложения.
Адаптивная верстка
С ростом использования мобильных устройств с различными форм-факторами нам необходимо иметь инструменты, которые позволяют делать Android-приложения, адаптированные к различным типам экранов. Вот почему Android предоставляет нам Window Size Classes, которые определяют три большие группы форматов экрана для разработки проектов. Благодаря этому мы избегаем сложностей и размышлений о многих вариантах дизайна, чтобы сократить наши возможности до 3 групп: Compat, Medium и Expanded.
Классы размеров Windows
О поддержка различных размеров экрана прочитайте здесь.
Еще одним важным ресурсом, который у нас есть, являются Canonical Layouts, которые представляют собой предопределенные макеты экрана, которые можно использовать для большинства сценариев в наших приложениях для Android, а также показывают нам руководство по их адаптации к большим экранам.
Другие интересные ресурсы:
- 3 вещи, которые нужно знать о форм-факторах с Google I/O 2022
- Плейлист: Форм-факторы на Google I/O
- Курс по форм-факторам
- Ещё форм-факторы на Google I/O 2022
Производительность
Мы должны обеспечить лучший пользовательский опыт не только на старте приложения, но и на протяжении всего его жизненного цикла. По этой причине важно иметь инструменты, позволяющие проводить превентивный анализ и постоянный мониторинг случаев, которые могут повлиять на производительность приложения. Вот список инструментов, которые помогут вам в этом:
Обновления в приложении
Обновление приложения означает, что ваши пользователи могут опробовать новые функции, воспользоваться улучшениями производительности или исправлениями ошибок. Хотя некоторые пользователи включают фоновые обновления, когда их устройство подключено к безлимитному соединению, другим пользователям может потребоваться напоминание об установке обновлений. Обновления в приложении — это функция Google Play Core библиотек, которая предлагает активным пользователям обновить ваше приложение.
Функция обновлений в приложении поддерживается на устройствах под управлением Android 5.0 (уровень API 21) или выше. Кроме того, обновления в приложении поддерживаются только для мобильных устройств Android, планшетов Android и устройств Chrome OS.
Отзывы в приложении
Google Play In-App Review API позволяет предлагать пользователям отправлять оценки и отзывы в Play Store, не выходя из приложения или игры.
Как правило, поток создания отзыва в приложении может быть запущен в любое время на протяжении всего пути пользователя в вашем приложении. Во время запроса пользователь может оценить ваше приложение от 1 до 5 звезд и добавить необязательный комментарий. После отправки обзор отправляется в Play Store и в конечном итоге отображается там.
Чтобы защитить конфиденциальность пользователей и избежать неправомерного использования API, существуют строгие правила, которым должно следовать ваше приложение в отношении того, когда запрашивать отзыв в приложении и самого дизайна запроса.
Доступность
Доступность — это важная функция при проектировании и создании программного обеспечения, которая дает возможность людям с ограниченными возможностями использовать приложение, а также улучшает их взаимодействие с пользователем. Некоторые виды инвалидности, на улучшение которых направлена эта концепция: люди с проблемами зрения, дальтонизмом, проблемами со слухом, проблемами с движением пальцев, когнитивными нарушениями и пр.
Рассмотрите:
- Увеличение видимости текста (цветовой контраст, изменяемый размер текста)
- Использование больших и простых элементов управления
- Описание каждого элемента пользовательского интерфейса
Проверить руководство по доступности.
Безопасность
Безопасность — это еще один, если не самый важный аспект, который мы должны учитывать при разработке приложений. Вам надо учитывать защиту целостности устройства, безопасность данных и доверие пользователя, поэтому ниже я перечисляю ряд советы, которые помогут вам в этом.
- Шифруйте конфиденциальные данные и файлы: используйте EncryptedSharedPreferences и EncryptedFile.
- Применяйте разрешения на основе цифровой подписи.
- Используйте разрешения на основе подписи при обмене данными между приложениями, которыми вы управляете.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <permission android:name="my_custom_permission_name" android:protectionLevel="signature" />
- Не помещайте ключи, токены или конфиденциальные данные, необходимые для конфигурации вашего приложения, непосредственно в файлы или классы, которые находятся внутри репозитория проекта. Вместо этого используйте local.properties.
Каталоги версий
Gradle предоставляет стандартный способ централизованного управления зависимостями проекта, называемый каталогом версий; он был экспериментально представлен в версии 7.0 и официально выпущен в версии 7.4.
Преимущество:
- Для каждого каталога Gradle генерирует типобезопасные accessor-ы, чтобы вы могли легко добавлять зависимости с помощью автозаполнения в среде IDE.
- Каждый каталог виден всем проектам сборки. Это центральное место для объявления версии зависимости и обеспечения того, чтобы изменение этой версии применялось к каждому подпроекту.
- Каталоги могут объявлять пакеты зависимостей, которые представляют собой «группы зависимостей», которые обычно используются вместе.
- Каталоги могут отделять группу и имя зависимости от ее фактической версии и вместо этого использовать ссылки на версию, что позволяет совместно использовать объявление версии между несколькими зависимостями.
Узнайте больше об этот тут.
Логирование
Логи — это программный инструмент, используемый для регистрации информации о выполнении программы. В него попадают важные события, сообщения об ошибках, отладочные сообщения и другая информация, которая может быть полезна для диагностики проблем или понимания того, как работает программа. Логи можно настроить для записи сообщений в разные места, например в файл журнала, на консоль, в базу данных или путем отправки сообщений на сервер регистрации.
Линтер
Линтер — это инструмент, который используется для анализа исходного кода программы с целью поиска потенциальных проблем или ошибок в коде. Эти проблемы могут быть синтаксическими, неподходящим стилем кода, отсутствием документации, проблемами безопасности и т.д., и они могут влиять на качество и удобство сопровождения кода.
Линтеры для Android:
Если вам нравится мой контент и вы хотите поддержать мою работу, вы можете подарить мне чашечку кофе ☕️ 🥰