Ask me anything
Ithy Logo
Sign in to save

Откройте для Себя Эталонные Android-Проекты: Многомодульность, MVI, Compose и DI в Действии

Погрузитесь в мир современной Android-разработки с подборкой из 10 репозиториев, демонстрирующих передовые архитектурные подходы.

android-multimodule-mvi-compose-repos-pofjbeta

Современная разработка Android-приложений все чаще опирается на многомодульную архитектуру, паттерн MVI (Model-View-Intent), декларативный UI с Jetpack Compose и эффективное управление зависимостями (Dependency Injection). Такой подход позволяет создавать масштабируемые, тестируемые и легко поддерживаемые приложения. Если вы ищете примеры проектов, которые реализуют эти концепции без использования Kotlin Multiplatform (KMP), то вы попали по адресу.

Ключевые Моменты для Понимания

  • Структурированная Многомодульность: Проекты разделены на логические модули (app, core, feature), где каждый feature-модуль инкапсулирует конкретную функциональность и имеет внутреннее деление на слои (presentation, domain, data).
  • Реактивный MVI: Паттерн Model-View-Intent используется для управления состоянием UI, обеспечивая однонаправленный поток данных и предсказуемость поведения приложения.
  • Современный UI и Навигация: Пользовательский интерфейс построен с использованием Jetpack Compose, а навигация между экранами и модулями реализуется с помощью Jetpack Navigation Component или аналогичных решений.

Расшифровка Современной Android Архитектуры

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

Многомодульная Архитектура: Организация и Преимущества

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

Пример графа зависимостей в многомодульном приложении

Пример графа зависимостей, иллюстрирующий связи между модулями. Источник: Android Developers


Типичная структура модулей:

  • :app модуль: Является точкой входа в приложение. Он координирует взаимодействие между различными feature-модулями, управляет основной навигацией и подключает все необходимые зависимости.
  • :core модуль: Содержит общий код, используемый во всем приложении. Это могут быть утилиты, базовые классы, константы, расширения, компоненты для Dependency Injection, общие ресурсы и интерфейсы для навигации.
  • :feature модули: Каждый такой модуль инкапсулирует отдельную функциональность приложения (например, профиль пользователя, каталог товаров, настройки). Это способствует лучшей изоляции и независимой разработке фич.

Внутренняя структура :feature модуля:

Для следования принципам чистой архитектуры (Clean Architecture) и четкого разделения ответственности, каждый :feature модуль дополнительно разбивается на слои:

Структура feature-модуля с разделением на presentation, domain и data

Визуализация слоев внутри feature-модуля. Источник: Syed Ovais Akhtar, Medium


  • :presentation (Слой представления): Отвечает за все, что связано с UI. Здесь находятся Jetpack Compose экраны (Composable функции), ViewModel (реализующие логику MVI), обработка пользовательского ввода и управление состоянием UI. Навигация, специфичная для данной фичи, также может управляться отсюда.
  • :domain (Слой бизнес-логики): Содержит бизнес-правила приложения. Включает UseCases (интеракторы), модели домена (бизнес-сущности) и интерфейсы репозиториев. Этот слой не зависит от Android SDK и других внешних фреймворков, что делает его легко тестируемым.
  • :data (Слой данных): Отвечает за получение и хранение данных. Включает реализации репозиториев (определенных в domain-слое), источники данных (Data Sources) для работы с сетью (API, Retrofit) и локальным хранилищем (базы данных, SharedPreferences), а также мапперы для преобразования моделей данных (DTO) в модели домена и наоборот.

MVI (Model-View-Intent): Предсказуемое Управление Состоянием

MVI — это архитектурный паттерн, который продвигает однонаправленный поток данных (Unidirectional Data Flow - UDF). Это делает состояние приложения более предсказуемым и облегчает отладку.

Диаграмма потока данных в MVI архитектуре

Общая схема работы MVI-паттерна. Источник: Mohammed Khudair, Medium


  • Model: Представляет состояние приложения. В MVI это не просто данные, а полноценное состояние UI, которое является единственным источником истины.
  • View: Отображает Model и передает пользовательские действия (Intents) для обработки. В нашем случае View реализуется с помощью Jetpack Compose.
  • Intent: Представляет намерение пользователя или событие в системе, которое может изменить состояние. Это не Android Intent, а скорее команда или действие.

ViewModel часто выступает в роли компонента, который обрабатывает Intents, взаимодействует с UseCases из domain-слоя, обновляет Model (State) и передает его во View для отображения.

Jetpack Compose: Декларативный UI

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

Навигация в Многомодульном Приложении

Управление навигацией между различными экранами и фичами, находящимися в разных модулях, требует продуманного подхода. Jetpack Navigation Component хорошо адаптирован для многомодульных проектов и позволяет определять графы навигации как внутри фич, так и для переходов между ними. Часто используется общий навигационный интерфейс в core модуле, который реализуется в app модуле или конкретных feature модулях.

Dependency Injection (DI): Hilt или Koin

DI является ключевым элементом для построения слабосвязанной и тестируемой архитектуры. Фреймворки, такие как Hilt (от Google, основан на Dagger) или Koin (более легковесная Kotlin-библиотека), упрощают предоставление зависимостей компонентам приложения (ViewModel, UseCases, репозитории) во всех модулях.


Карта Архитектурных Компонентов

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

mindmap root["Современная Android Архитектура"] id1["Многомодульность"] id1_1["app модуль
(Точка входа, Навигация)"] id1_2["core модуль
(Общие утилиты, DI, Базовые компоненты)"] id1_3["feature модули
(Функциональные блоки)"] id1_3_1[":feature:presentation
(UI (Compose), ViewModel (MVI), Навигация)"] id1_3_2[":feature:domain
(Бизнес-логика, UseCases, Модели домена)"] id1_3_3[":feature:data
(Репозитории, Источники данных (API, БД), Модели данных)"] id2["Архитектурный паттерн"] id2_1["MVI (Model-View-Intent)"] id2_1_1["Однонаправленный поток данных"] id2_1_2["Управление состоянием"] id2_1_3["Предсказуемость"] id3["UI Framework"] id3_1["Jetpack Compose
(Декларативный UI)"] id4["Навигация"] id4_1["Jetpack Navigation Component"] id4_2["Собственные решения"] id5["Dependency Injection (DI)"] id5_1["Hilt"] id5_2["Koin"] id6["Преимущества"] id6_1["Масштабируемость"] id6_2["Поддерживаемость"] id6_3["Тестируемость"] id6_4["Уменьшение времени сборки"] id6_5["Параллельная разработка"]

Эта карта иллюстрирует, как различные технологии и концепции объединяются для создания robust (надежного) и хорошо структурированного Android-приложения.


Сравнительный Анализ Ключевых Аспектов Архитектуры

Для более глубокого понимания того, как различные аспекты современной Android-архитектуры оцениваются в контексте идеальной реализации, представлен следующий радарный график. Он отражает субъективную оценку важности и степени проработки каждого компонента в эталонном проекте, соответствующем вашему запросу. Оценки варьируются от 3 (базовый уровень) до 5 (продвинутый уровень).

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


Таблица Ответственности Модулей

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

Тип Модуля Основная Ответственность Примеры Компонентов/Задач
:app Точка входа, сборка приложения, глобальная навигация, инициализация DI. Главная Activity, Application класс, графы навигации верхнего уровня, сборка графа DI (Hilt ApplicationComponent).
:core Общий код, утилиты, базовые классы, общие ресурсы, интерфейсы для межмодульного взаимодействия. Сетевой клиент, база данных (если общая), вспомогательные функции, базовые ViewModel/UseCase, общие модели данных (если применимо), интерфейсы навигации.
:feature:presentation Отображение UI, обработка пользовательского ввода, управление состоянием UI. Jetpack Compose экраны (Composable функции), ViewModel (MVI), UI Events, UI State, навигация внутри фичи.
:feature:domain Бизнес-логика, правила приложения, не зависящие от платформы. UseCases (Интеракторы), модели домена (бизнес-сущности), интерфейсы репозиториев.
:feature:data Доступ к данным, реализация репозиториев, работа с источниками данных. Реализации репозиториев, API сервисы (Retrofit), DAO для Room, мапперы DTO в доменные модели и наоборот, управление кэшем.

Подборка из 10 Репозиториев на GitHub

Ниже представлен список из 10 репозиториев на GitHub, которые демонстрируют многомодульную архитектуру с модулями app, feature (с подмодулями presentation, domain, data) и core. В этих проектах используется Kotlin, MVI, Jetpack Compose, навигация и Dependency Injection (Hilt или Koin), и они не являются Kotlin Multiplatform (KMP) проектами.

  1. Multi-Module-Clean-Architecture-Android-Kotlin (basaransuleyman)

    Этот репозиторий является отличным примером многомодульной архитектуры, следующей принципам Clean Architecture. Он включает модули app, feature (с подразделами presentation, domain, data) и core. Использует MVI, Jetpack Compose, Hilt для DI и Navigation Component. Отлично подходит для понимания структурирования сложного приложения.

    Перейти к репозиторию

  2. Jetpack-Compose-MVI-Architecture (naeemdev)

    Проект сфокусирован на демонстрации MVI с Jetpack Compose в многомодульной среде. Четко выделены слои presentation, domain, data внутри фича-модулей. Используется Hilt для DI и Navigation Component. Модуль app интегрирует фичи, а core содержит общие компоненты.

    Перейти к репозиторию

  3. Jetpack-Compose-MVI-Demo (RivuChk)

    Демонстрационный проект, показывающий реализацию MVI и Jetpack Compose в многомодульной структуре. Включает app, feature (с presentation, domain, data) и core модули. Использует DI и навигацию. Хороший пример для изучения основ.

    Перейти к репозиторию

  4. Android_MVI_Compose (zacky-dzacky)

    Этот репозиторий представляет собой скелет (шаблон) для современного Android-приложения с MVI, Jetpack Compose и многомодульностью. Фича-модули разделены на presentation, domain, data. Используется Hilt для DI и Navigation Component.

    Перейти к репозиторию

  5. Jetpack-Compose-MVI-Coroutines-Flow (Kotlin-Android-Open-Source)

    Проект демонстрирует MVI с использованием Kotlin Coroutines и Flow для асинхронных операций. Архитектура многомодульная (app, feature с presentation/domain/data, core), UI на Jetpack Compose, DI через Hilt или Koin, навигация с Navigation Component.

    Перейти к репозиторию

  6. MVI-Compose-Sample (Atwa)

    Пример приложения с MVI и Jetpack Compose, структурированный по модулям app, feature (с подмодулями presentation, domain, data) и core для DI (Hilt). Демонстрирует чистую архитектуру и навигацию.

    Перейти к репозиторию

  7. android-modular-architecture (vmadalin)

    Этот репозиторий демонстрирует модульный подход для создания масштабируемых и тестируемых Android-приложений. Включает разделение на app, feature (с presentation, domain, data) и core. Использует Jetpack Compose, Navigation и Hilt. Хотя MVI может быть не единственным паттерном, общая структура соответствует запросу.

    Перейти к репозиторию

  8. android-multimodule-architecture-concepts (davidepanidev)

    Репозиторий содержит примеры и концепции многомодульной архитектуры, включая варианты с MVI-подобными подходами, Jetpack Compose, навигацией и DI. Модули структурированы по слоям (presentation, domain, data) внутри фич.

    Перейти к репозиторию

  9. architecture-samples (android) — ветка multimodule

    Официальный репозиторий от Google с примерами различных архитектур. Ветка multimodule содержит проекты, демонстрирующие многомодульность с модулями app, feature и core, использованием Jetpack Compose, Navigation Component и Hilt. Некоторые примеры могут использовать MVI-подобные паттерны или MVVM.

    Перейти к репозиторию

  10. JetMVI-Template (myofficework000)

    Шаблон проекта, использующий MVI, Jetpack Compose, Coroutines, Koin для DI и навигацию. Архитектура многомодульная с разделением feature-модулей на слои presentation, domain и data. Хороший стартовый набор для новых проектов.

    Перейти к репозиторию


Видеоурок по Масштабируемой Архитектуре

Для дополнительного понимания принципов построения масштабируемых многомодульных приложений с Jetpack Compose, рекомендуем посмотреть следующее видео. В нем рассматриваются ключевые аспекты, такие как навигация, модули API и Impl, а также внедрение зависимостей, что напрямую связано с вашим запросом.

Видео: "Scalable multi-module architecture for Jetpack Compose apps" от Google Developers.

В этом докладе подробно разбирается, как Jetpack Compose, навигация, многомодульная архитектура и Dependency Injection работают вместе для создания современных и эффективных Android-приложений.


Часто Задаваемые Вопросы (FAQ)

Каковы основные преимущества многомодульной архитектуры?

Многомодульная архитектура предлагает несколько ключевых преимуществ:

  • Улучшенная масштабируемость: Легче добавлять новые функции и изменять существующие без значительного влияния на другие части приложения.
  • Сокращение времени сборки: Gradle может пересобирать только измененные модули и их зависимости, что ускоряет процесс разработки.
  • Повышенная поддерживаемость: Четкое разделение на модули и слои делает код более понятным и легким для модификации.
  • Улучшенная тестируемость: Изолированные модули и слои легче тестировать как юнит-тестами, так и интеграционными.
  • Параллельная разработка: Разные команды могут работать над разными фича-модулями одновременно, не мешая друг другу.
  • Строгое разделение ответственности: Каждый модуль имеет свою четко определенную зону ответственности.
Почему стоит использовать MVI с Jetpack Compose?

Сочетание MVI и Jetpack Compose дает несколько преимуществ:

  • Однонаправленный поток данных (UDF): MVI обеспечивает предсказуемое управление состоянием. View (Compose UI) получает состояние и отображает его. Пользовательские действия (Intents) отправляются в ViewModel, которая обновляет состояние. Это упрощает отладку и понимание потока данных.
  • Декларативный UI: Jetpack Compose позволяет описывать UI как функцию от состояния. Когда состояние (Model в MVI) изменяется, Compose автоматически перерисовывает только необходимые части UI.
  • Разделение логики и представления: MVI помогает четко отделить логику управления состоянием (ViewModel) от логики отображения (Compose).
  • Тестируемость: ViewModel в MVI становится легко тестируемой, так как ее работа заключается в преобразовании Intents в State, что можно проверить юнит-тестами.
Как Dependency Injection (DI) помогает в таких проектах?

Dependency Injection (DI) играет важную роль в многомодульных проектах с архитектурой MVI и Compose:

  • Управление зависимостями между модулями: DI (например, Hilt или Koin) упрощает предоставление зависимостей из одного модуля (например, :core или :data) другому (например, :feature:presentation или :feature:domain).
  • Слабая связанность: Компоненты не создают свои зависимости напрямую, а получают их извне. Это делает систему более гибкой и модульной.
  • Упрощение тестирования: При юнит-тестировании легко подменять реальные зависимости на мок-объекты или тестовые двойники.
  • Централизованная конфигурация: DI-фреймворки позволяют настраивать создание и жизненный цикл зависимостей в одном месте.
  • Поддержка скоупов: Hilt и Koin позволяют определять жизненные циклы зависимостей (например, Application-scope, Activity-scope, ViewModel-scope), что важно для корректного управления ресурсами.
Какие распространенные проблемы могут возникнуть при такой архитектуре?

Несмотря на преимущества, при внедрении такой сложной архитектуры могут возникнуть некоторые сложности:

  • Начальная сложность: Настройка многомодульного проекта с MVI, Compose и DI может быть сложной для разработчиков, незнакомых с этими концепциями.
  • Увеличение времени начальной настройки Gradle: Хотя инкрементальные сборки ускоряются, первоначальная конфигурация Gradle для множества модулей может потребовать времени и усилий.
  • "Over-engineering": Для небольших проектов такая сложная архитектура может быть избыточной и привести к неоправданному усложнению.
  • Управление графом зависимостей: При большом количестве модулей важно правильно выстраивать зависимости между ними, чтобы избежать циклических зависимостей или слишком сложных графов.
  • Коммуникация между модулями: Требуется продуманный подход к организации взаимодействия между фича-модулями, часто через интерфейсы в :core модуле, чтобы сохранить их независимость.

Рекомендуемые Запросы для Дальнейшего Изучения


Источники и Полезные Ссылки

droidkaigi.github.io
Multi-Modularizing Apps

Last updated May 19, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI