Как стать автором
Обновить
1023.55
OTUS
Цифровые навыки от ведущих экспертов

Разработка под Android в 2024 году

Время на прочтение15 мин
Количество просмотров15K
Автор оригинала: Jorge Luis Castro Medina

Нашла и перевела: Ксения Мосеенкова

Эта статья отражает моё личное мнение и профессиональные взгляды, учитывающие различные точки зрения в сообществе Android-разработчиков. Кроме того, я регулярно просматриваю руководства от Google для Android.

Важно подчеркнуть: некоторые хорошие инструменты, паттерны и архитектуры я не упомянул в статье в явном виде, но это не отменяет их потенциал в качестве ценных альтернатив для разработки Android-приложений.

Используйте Kotlin везде

Kotlin — язык программирования, разработанный компанией JetBrains. Рекомендован компанией Google, которая официально анонсировала его в мае 2017 года (см. здесь). Он совместим с Java и может работать на JVM, благодаря чему его быстро стали использовать в разработке Android-приложений.

Независимо от того, как долго вы занимаетесь Android-разработкой, рассматривайте Kotlin в первую очередь — не плывите против течения. Google объявила о таком подходе на своей ежегодной конференции Google I/O 2019. С Kotlin вы сможете использовать все возможности языка, включая мощь корутинов и современные библиотеки, разработанные для экосистемы Android.

Официальная документация по Kotlin — здесь.

Kotlin — многоцелевой язык, который можно использовать не только для разработки приложений для Android. Но всё-таки большая часть его популярности была обусловлена именно этим, как мы можем видеть на следующем графике.

KotlinConf ‘23
KotlinConf ‘23

Kotlin 2.0 уже здесь

Ещё один важный момент — это выход Kotlin 2.0, который уже не за горами. На момент написания статьи он находится в версии 2.0.0-beta3.

Новый компилятор K2 — дополнение в Kotlin 2.0, которое позволит значительно повысить производительность, ускорить разработку новых фич языка, унифицировать все платформы, поддерживаемые Kotlin, и предоставить лучшую архитектуру для мультиплатформенных проектов.

Чтобы узнать больше, прочитайте обзор KotlinConf '23.

Compose 

Jetpack Compose — это набор инструментов для создания нативных пользовательских интерфейсов в Android-приложениях. Он помогает быстро воплотить идеи в жизнь благодаря меньшему количеству кода, мощным инструментам и интуитивно понятным API Kotlin.

— из документации Jetpack Compose.

Jetpack Compose является частью библиотеки Android Jetpack и использует язык программирования Kotlin для лёгкого создания нативного пользовательского интерфейса. Кроме того, он интегрируется с другими библиотеками Android Jetpack, такими как LiveData и ViewModel, чтобы упростить создание реактивных и поддерживаемых Android-приложений.

Некоторые ключевые особенности Jetpack Compose:

  1. Декларативный пользовательский интерфейс.

  2. Настраиваемые виджеты.

  3. Простая интеграция с существующим кодом.

  4. Предварительный просмотр в реальном времени.

  5. Повышенная производительность.

Ресурсы:

Jetpack для Android

Jetpack — это набор библиотек, которые помогают разработчикам следовать лучшим практикам, сокращать количество шаблонного кода и писать код, стабильно работающий на всех версиях и устройствах Android.

— из документации Jetpack.

К наиболее распространённым инструментам относятся:

Material You / Material Design

Material You — новая фича кастомизации, представленная в Android 12 и реализованная в Material Design 3. Благодаря ей можно настраивать внешний вид операционной системы в соответствии с личными предпочтениями. Она дополняет Material Design — адаптивную систему рекомендаций, компонентов и инструментов, созданную для поддержания высочайших стандартов дизайна пользовательских интерфейсов. Material Design помогает выстроить командную работу дизайнеров и разработчиков.

На данный момент последней версией Material Design является 3, подробнее о ней можно узнать здесь. Кроме того, также можно воспользоваться Material Theme Builder, который поможет определить тему приложения.

Codelab

Тематическое оформление интерфейса в Compose с Material 3

API Splash screen

API SplashScreen в Android используется, чтобы приложения на Android 12 и более поздних версиях могли отображаться корректно. Отсутствие обновления может повлиять на запуск приложений. Крайне важно быстро внедрить этот API, чтобы обеспечить стабильный пользовательский опыт на последних версиях операционной системы.

Clean Architecture

Концепция Clean Architecture  («Чистая архитектура») была введена Робертом К. Мартином. В её основе лежит разделение ответственности путём разделения программного обеспечения на слои.

Характеристики

  1. Независимость от фреймворков.

  2. Тестируемость.

  3. Независимость от пользовательского интерфейса.

  4. Независимость от базы данных.

  5. Независимость от любого внешнего влияния.

Правило зависимости

Правило зависимости очень хорошо описано автором в его статье, The Clean Code Blog

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

The Clean Code Blog

Чистая архитектура в Android

  • Презентация: Activities, Composables, Fragments, View Models и другие компоненты представления.

  • Домен: Use Cases, Entities, Repositories и другие компоненты домена.

  • Данные: Реализации репозиториев, Mappers, DTO и т. д.

Архитектурные паттерны для уровня представления

Архитектурный паттерн — это стратегия более высокого уровня, которая направлена на помощь в проектировании архитектуры программного обеспечения и характеризуется тем, что является решением общих архитектурных проблем. Архитектурные паттерны похожи на паттерны проектирования, но они более масштабны и затрагивают более глобальные вопросы — например, общая структура системы, отношения между компонентами и способ управления данными.

В рамках слоя представления я бы хотел выделить эти архитектурные паттерны:

  • MVVM

  • MVI

Я не буду вдаваться в объяснение каждого из них — это легко можно нагуглить. 

Кроме того, посмотрите руководство по архитектуре приложений

Изображение с сайта developer.android.com
Изображение с сайта developer.android.com

Инъекция зависимостей

Инъекция зависимостей — это паттерн проектирования программного обеспечения, который позволяет клиенту получать свои зависимости из внешнего источника, а не создавать их самостоятельно. Это техника для достижения инверсии контроля (IoC) между объектами и их зависимостями.

Принцип модульности

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

Изображение с сайта developer.android.com
Изображение с сайта developer.android.com

Преимущества модульности

Возможность повторного использования: наличие независимых модулей позволяет повторно использовать их в различных частях приложения или даже в других приложениях.

Строгий контроль видимости: модули позволяют легко контролировать то, что открывается для других частей кодовой базы.

Настраиваемая доставка: Play Feature Delivery использует расширенные возможности пакетов приложений, позволяя доставлять определенные функции приложения условно или по требованию.

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

Простота обслуживания: разделение приложения на независимые модули, каждый из которых обладает собственной функциональностью и ответственностью, облегчает понимание и сопровождение кода.

Простота тестирования: независимые модули можно тестировать изолированно, благодаря чему обнаруживать и исправлять ошибки становится проще.

Улучшение архитектуры: модульность помогает улучшить архитектуру приложения засчёт лучшей организации и структуры кода.

Улучшение совместной работы: благодаря наличию независимых модулей разработчики могут работать над разными частями приложения одновременно, не мешая друг другу.

Время сборки: некоторые функции Gradle (инкрементная сборка, кэш сборки или параллельная сборка) могут использовать модульность для повышения производительности сборки.

Подробнее в официальной документации.

Сеть

Сериализация

В этом разделе я хотел бы упомянуть два важных, на мой взгляд, инструмента: Moshi, широко используемый в связке с Retrofit, и Kotlin Serialization, ставку команды Kotlin в JetBrains.

Это две библиотеки сериализации / десериализации для Kotlin и Java, которые позволяют преобразовывать объекты в JSON или другой формат сериализации и наоборот. Обе библиотеки имеют удобный интерфейс, оптимизированный для использования в мобильных и настольных приложениях. Moshi в первую очередь ориентирована на сериализацию JSON, в то время как Kotlin Serialization поддерживает различные форматы сериализации, включая JSON.

Загрузка изображений

Есть несколько сторонних библиотек, которые помогают загрузить изображение из интернета. Эти библиотеки выполняют за вас большую часть работы: они занимаются кэшированием (чтобы не загружать изображение несколько раз) и сетевой логикой для загрузки изображения и его отображения на экране.

из официальной документации по Android

Реактивность / управление потоками

Когда речь заходит о реактивном программировании и асинхронных процессах, корутины Kotlin выделяются своими Suspension Functions и Flow. Однако важно признать ценность RxJava в разработке приложений для Android. Несмотря на растущее распространение корутинов и Flow, RxJava остаётся надёжным и популярным выбором во многих проектах.

Для новых проектов всегда выбирайте Kotlin Coroutines. Некоторые концепции Kotlin Coroutines описаны в этой статье

Локальное хранилище

Важным моментом при создании мобильных приложений является возможность сохранять данные локально — например, данные сессии или кэша. Важно выбрать правильный вариант хранения, исходя из потребностей приложения. Можно хранить неструктурированные данные, такие как ключ-значение, или структурированные — например, как база данных. Имейте в виду, что в этом пункте не упоминаются все доступные нам типы локальных хранилищ (например, файловые), а только инструменты, которые позволяют сохранять данные.

Предложения:

Тестирование

Тестирование при разработке программного обеспечения необходимо для обеспечения качества продукта. Тесты выявляют ошибки, проверяют результат на соответствие требованиям и в конечном счёте обеспечивают удовлетворённость клиентов. Ниже приведены некоторые наиболее популярные инструменты тестирования:

См. раздел «Тестирование» в документации.

Тестирование скриншотами

Скриншот-тестирование в Android подразумевает автоматическое создание скриншотов элементов пользовательского интерфейса в приложении и сравнение их с исходными изображениями. Это помогает выявить любые непреднамеренные визуальные изменения, обеспечить единообразие внешнего вида пользовательского интерфейса в разных версиях и конфигурациях приложения, а также обнаружить визуальные регрессии на ранних этапах разработки.

Оптимизации R8

R8 — это компилятор, который преобразует байткод Java проекта в формат DEX, работающий на платформе Android. Это инструмент, который помогает преобразовать и уменьшить код приложения путём сокращения имён классов и их свойств, а также устранения неиспользуемого кода и ресурсов в проекте. Чтобы узнать больше, ознакомьтесь с документацией Android о сокращени и оптимизации приложения. Кроме того, вы можете отключить определённые задачи или настроить поведение R8 с помощью файлов правил ProGuard.

Изображение с сайта androidtopics.dipien.com
Изображение с сайта androidtopics.dipien.com
  • Сокращение кода

  • Сокращение ресурсов

  • Обфускация

  • Оптимизация

Сторонние инструменты

  • DexGuard

Play Feature Delivery

Модель обслуживания приложений в Google Play, называемая Dynamic Delivery, использует Android App Bundles для создания и обслуживания оптимизированных APK для каждой конфигурации устройства пользователя. Поэтому пользователи загружают только код и ресурсы, необходимые для запуска приложения.

— из документации по Android-разработке.

Адаптивная вёрстка

Изображение с сайта android-developers.googleblog.com
Изображение с сайта android-developers.googleblog.com

Использование мобильных устройств с различными форм-факторами растёт — и нам необходимы инструменты для работы с Android-приложениями, адаптированными под разные типы экранов. Именно поэтому Android предоставляет Window Size Classes («классы размеров окон»). Говоря простым языком, они представляют собой три большие группы форматов экранов, обозначающие критические точки для разработки дизайна. Таким образом, нам не приходится думать о множестве вариантов дизайна экрана, а возможности сводятся к трём группам, а именно: Compat, Medium и Expanded.

Window Size Classes. Изображение с сайта developer.android.com
Window Size Classes. Изображение с сайта developer.android.com
Изображение с сайта developer.android.com
Изображение с сайта developer.android.com

Поддержка различных размеров экрана

Ещё один важный имеющийся у нас ресурс — это Canonical Layouts («канонические макеты») — предопределённый дизайн экранов, который можно использовать для большинства сценариев в Android-приложениях, а также руководство по адаптации их к большим экранам.

Руководство по форм-факторам

Локализация 

Локализация подразумевает адаптацию продукта под потребности различных аудиторий в разных регионах. Локализация включает в себя перевод текстов, корректировку форматов и учёт культурных аспектов. Её преимущества — доступ к глобальным рынкам, улучшение пользовательского опыта, повышение удовлетворённости клиентов, конкурентоспособность на мировом рынке и соответствие местным нормам.

Примечание: BCP 47 — это стандарт, используемый Android для интернационализации.

Ссылки

Производительность

Изображение с сайта android-developers.googleblog.com
Изображение с сайта android-developers.googleblog.com

Разрабатывая приложения для Android, нужно позаботиться о том, чтобы пользовательский опыт был на высоком уровне не только в начале работы приложения, но и на протяжении всего времени его использования. Поэтому важно иметь инструменты для профилактического анализа и постоянного мониторинга ситуаций, которые могут повлиять на производительность приложения. Ниже представлен список инструментов, которые помогут в этом:

Обновления в приложении

Когда пользователи обновляют приложение на своих устройствах, они могут попробовать новые фичи, а также почувствовать положительный эффект от улучшения производительности и багфиксов. Хотя некоторые пользователи включают фоновые обновления во время использования Wi-Fi, другим пользователям могут потребоваться напоминания об установке обновлений. In-app updates — это функция библиотек Google Play Core, которая предлагает активным пользователям обновить приложение.

Функция In-app updates поддерживается на устройствах Android 5.0 (уровень API 21) или выше. Кроме того, In-app updates поддерживаются только на мобильных устройствах Android, планшетах Android и устройствах Chrome OS.

— из документации.

Изображение с сайта developer.android.com
Изображение с сайта developer.android.com

In-App Reviews

API Google Play In-App Review позволяет побуждать пользователей отправлять оценки и отзывы в Play Store без выхода из приложения или игры.

Как правило, In-App Review запускается в любой момент на протяжении всего пути пользователя. Во время этого процесса пользователь может оценить ваше приложение по системе от 1 до 5 звёзд и по желанию оставить комментарий. После этого отзыв отправляется в Play Store.

Чтобы защитить конфиденциальность пользователей и избежать неправомерного использования API, приложение должно следовать строгим правилам в отношении того, когда запрашивать In-App Review.

—  из документации In-App Review.

Observability

В условиях высокой конкуренции в экосистеме приложений достижение хорошего пользовательского опыта начинается с отсутствия багов в приложении. Один из лучших способов это обеспечить — своевременно обнаруживать проблемы и знать, как приступить к их устранению. Используйте Android Vitals, чтобы определить области приложения, в которых чаще всего происходят сбои и возникают проблемы с откликом. Затем используйте пользовательские отчёты о сбоях в Firebase Crashlytics, чтобы узнать более подробную информацию о первопричинах и эффективно устранить неполадки.

Инструменты

Доступность (Accessibility)

Доступность — это важная характеристика, которая даёт возможность людям с ограниченными возможностями использовать приложение, а также улучшает их пользовательский опыт. К числу таких ограниченных возможностей относятся: проблемы со зрением и слухом, дальтонизм, проблемы с координацией и мелкой моторикой, когнитивные нарушения и т. д.

Соображения:

  • Повысить видимость текста (цветовой контраст, изменяемый по размеру текст).

  • Использовать крупные и простые элементы управления.

  • Описать каждый элемент пользовательского интерфейса.

 Подробнее можно почитать в документации.

Безопасность 

Безопасность — важный аспект разработки, который нацелен на защиту целостности устройства, сохранность данных и поддержку доверия пользователя. Ниже я привожу ряд советов, которые помогут вам в этом.

  • Для входа в систему пользователя используйте Credential Manager (менеджер учётных данных) — это Jetpack API, который поддерживает несколько методов входа в систему, таких как имя пользователя и пароль, passkeys (ключи доступа), а также интегрированные решения для входа в систему (например, вход через Google) в одном API, что упрощает интеграцию для разработчиков.

  • Шифруйте конфиденциальные данные и файлы: Используйте EncryptedSharedPreferences и EncryptedFile.

  • Применяйте разрешения на основе подписей (signature-based permissions) при обмене данными между приложениями, которые вы контролируете.

<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.

  • Используйте SSL Pinning для дополнительной защиты связи между вашим приложением и удалёнными серверами. Это поможет предотвратить атаки типа «человек посередине» (man-in-the-middle) и обеспечит связь только с доверенными серверами, имеющими определённый SSL-сертификат.

res/xml/network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <pin-set expiration="2018-01-01">
            <pin digest="SHA-256">ReplaceWithYourPin</pin>
            <!-- backup pin -->
            <pin digest="SHA-256">ReplaceWithYourPin</pin>
        </pin-set>
    </domain-config>
</network-security-config>

Внедрите RASP (Runtime Application Self Protection) — это техника безопасности, которая защищает приложения от атак и уязвимостей во время выполнения. RASP отслеживает поведение приложения и обнаруживает подозрительные действия, которые могут указывать на атаку. RASP даёт следующие преимущества:

  • Обфускация кода

  • Обнаружение root-прав

  • Обнаружение несанкционированного доступа

  • Предотвращение атак реверс-инжиниринга

  • Антиотладочные техники

  • Обнаружение виртуальной среды

  • Анализ поведения приложений во время выполнения

Чтобы узнать больше, почитайте эту статью. Также некоторые рекомендации по безопасности от Android.

Каталоги версий

Gradle предоставляет стандартный способ централизованного управления зависимостями проекта, называемый каталогом версий. Он был экспериментально представлен в версии 7.0 и официально выпущен в версии 7.4.

Преимущества:

  • Для каждого каталога Gradle генерирует type-safe accessors, чтобы вы могли легко добавлять зависимости с автозаполнением в IDE.

  • Каждый каталог виден всем проектам сборки. Это центральное место, где можно объявить версию зависимости и убедиться, что изменение этой версии распространяется на все подпроекты.

  • В каталогах можно объявлять пакеты зависимостей, которые представляют собой «группы зависимостей», часто используемых вместе.

  • Каталоги могут отделять группу и имя зависимости от её фактической версии и использовать вместо этого ссылки на версии, что позволяет совместно объявлять версии для нескольких зависимостей.

см. подробнее

Секреты Gradle Plugin

Google настоятельно рекомендует не проверять API-ключ в системе контроля версий. Вместо этого следует хранить его в локальном файле secrets.properties, который находится в корневом каталоге проекта, но исключён из системы контроля версий, а затем использовать Secrets Gradle Plugin для Android для чтения API-ключа.

Логгер

Логгер — это программное средство, используемое для регистрации информации о выполнении программы; важных событий, сообщений об отладке ошибок и другой информации, которая может быть полезна для диагностики проблем или понимания того, как работает программа. Логгеры можно настроить на запись сообщений в разные места — например, в файл журнала, в консоль, в базу данных или путём отправки сообщений на сервер регистрации.

Линтер / статический анализатор кода

Linter — это инструмент программирования, который используется для анализа исходного кода программы с целью поиска потенциальных проблем или багов в коде. Среди проблем могут быть синтаксические ошибки, несоответствие стилю кода, отсутствие документации, проблемы безопасности и так далее, и они могут влиять на качество и сопровождаемость кода.

Google Play Instant

Google Play Instant позволяет нативным приложениям и играм запускаться на устройствах под управлением Android 5.0 (уровень API 21) или выше без установки. Такие приложения и игры, называемые мгновенными, можно создавать с помощью Android Studio. Предоставляя пользователям возможность запускать подобные приложения и игры и получать мгновенный опыт, вы делаете своё приложение или игру более доступными, что привлекает больше пользователей и увеличивает количество установок.

— из обзора Google Play Instant

Новый Design Hub

Команда Android предоставляет новый центр дизайна для создания красивых современных приложений для Android, который занимает централизованное место для понимания дизайна для Android в различных форм-факторах.

d.android.com/design/ui

Искусственный интеллект

Gemini и PalM 2 — две самые современные модели искусственного интеллекта, разработанные компанией Google, и они способны изменить ландшафт Android-разработки. Эти модели предлагают ряд преимуществ, которые повысят эффективность, удобство использования и инновационность приложений.

AI-инструменты, помогающие в написании кода

Studio Bot — это чат-бот в Android Studio, который отвечает на вопросы по Android-разработке, тем самым повышая продуктивность разработчиков. Он работает на основе искусственного интеллекта и понимает естественный язык, поэтому ему можно задавать вопросы о разработке на простом английском. Studio Bot помогает генерировать код, находить необходимые ресурсы, изучать лучшие практики.

GitHub Copilot — это инструмент на базе искусственного интеллекта для помощи пользователям в автодополнении кода. Вы можете использовать GitHub Copilot, чтобы получать рекомендации для целых строк или функций прямо в редакторе.

Amazon CodeWhisperer — это сервис Amazon, который генерирует рекомендации по коду, основываясь на контексте текущего кода. Он помогает писать более эффективный и безопасный код, а также открывать для себя новые API и инструменты.

Мультиплатформа Kotlin

Наконец, не менее значимым откровением года стал Kotlin Multiplatform. Несмотря на то, что наш основной фокус — разработка приложений для Android, Kotlin Multiplatform предлагает гибкость в создании полностью нативных приложений для Android с использованием фреймворка KMP. Этот стратегический шаг не только защищает будущие проекты, но и обеспечивает необходимой инфраструктурой для плавного перехода на мультиплатформенную среду, если мы решим это сделать.

Если вы хотите глубже изучить Kotlin Multiplatform, я хотел бы поделиться с вами парой моих статей. В них я исследую текущее состояние этой технологии и её значение для современной разработки программного обеспечения:


В заключение напоминаем про открытый урок «Инструменты Андроид для кроссплатформенной разработки» 21 марта. На нём:

  • напишем простое приложение под андроид, игру крестики-нолики;

  • выделим логику в кросс-платформенный модуль;

  • напишем визуальную часть для десктоп с использованием Compose multiplatform;

  • запустим приложение на разных платформах.

Записаться можно по ссылке.

Теги:
Хабы:
Всего голосов 16: ↑14 и ↓2+17
Комментарии13

Публикации

Информация

Сайт
otus.ru
Дата регистрации
Дата основания
Численность
101–200 человек
Местоположение
Россия
Представитель
OTUS