Chat
Ask me anything
Ithy Logo

Откройте для себя эталонные Android-репозитории: Многомодульность, MVI, Compose, Hilt и Навигация

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

android-multimodule-mvi-compose-hilt-repos-yzcyi80o

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

Ключевые моменты для разработчика

  • Многомодульная архитектура: Узнайте, как разделение на app, feature и core модули повышает управляемость проекта и скорость сборки.
  • Современный стек технологий: Поймите практическое применение MVI, Jetpack Compose, Hilt и Navigation Component в комплексных сценариях.
  • Готовые примеры: Используйте эти репозитории как отправную точку или источник вдохновения для ваших собственных проектов, изучая проверенные решения.

Понимание современной архитектуры Android-приложений

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

Многомодульность: Организация кода

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

  • app модуль: Основной модуль приложения, точка входа. Он зависит от feature и core модулей и объединяет их.
  • feature модули: Инкапсулируют определенную функциональность приложения (например, профиль пользователя, каталог товаров, настройки). Они должны быть максимально независимыми друг от друга. Именно здесь часто реализуется UI и бизнес-логика конкретной фичи.
  • core (или common, shared) модуль: Содержит общий код, используемый несколькими другими модулями. Это могут быть утилиты, базовые классы, модели данных, компоненты DI, ресурсы и т.д.

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

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

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

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

MVI — это архитектурный паттерн, который делает поток данных в приложении однонаправленным и циклическим. Основные компоненты:

  • Model: Представляет состояние UI и бизнес-логику. Единственный источник истины.
  • View: Отображает состояние (State) и передает действия пользователя как намерения (Intent).
  • Intent: Представляет намерение пользователя или системы изменить состояние.

MVI помогает создавать более предсказуемые и легко отлаживаемые приложения, так как изменения состояния происходят последовательно и явно.

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

Jetpack Compose — это современный инструментарий Android для создания нативного пользовательского интерфейса. Вместо императивного подхода (изменение UI через XML и поиск View) Compose использует декларативный стиль: вы описываете, как должен выглядеть UI для определенного состояния, а Compose автоматически обновляет его при изменении этого состояния. Это упрощает и ускоряет разработку UI.

Hilt: Внедрение зависимостей

Hilt — это библиотека для внедрения зависимостей (DI) для Android, построенная поверх Dagger. Hilt упрощает использование Dagger в Android-приложениях, предоставляя стандартный способ интеграции DI в компоненты Android (такие как Activity, Fragment, ViewModel) и уменьшая количество шаблонного кода.

Навигация в многомодульных проектах

Организация навигации между экранами, особенно когда они находятся в разных feature модулях, требует особого внимания. Цель — сохранить слабую связанность между модулями. Для этого часто используют Jetpack Navigation Component, кастомные координаторы навигации или другие подходы, позволяющие feature модулям не знать друг о друге напрямую.


Рекомендуемые GitHub репозитории

Ниже представлен список из 10 репозиториев, которые демонстрируют применение указанных технологий и подходов. Эти проекты послужат отличными примерами для изучения и внедрения лучших практик в ваши собственные Android-приложения на Kotlin.

  1. mo0rti/android-blueprint-hilt-modularization

    Этот проект представляет собой шаблон Android-приложения, реализующий MVI архитектуру с Kotlin Coroutines Flow, Hilt для внедрения зависимостей, многомодульную структуру (app, feature, core), координатор навигации и архитектуру с одной активностью. Отличный пример для понимания организации модулей и навигации между ними.

  2. Atwa/MVI-Compose-Sample

    Пример приложения, демонстрирующий MVI, Jetpack Compose, Coroutines, Retrofit, Hilt, Room и Navigation Component. Проект хорошо структурирован по feature-модулям, что позволяет наглядно увидеть разделение функциональности и использование Hilt для DI в контексте MVI и Compose.

  3. basaransuleyman/Multi-Module-Clean-Architecture-Android-Kotlin

    Этот репозиторий демонстрирует многомодульное приложение с Clean Architecture, используя комбинацию архитектурных паттернов MVVM и MVI. Включает Jetpack Compose для UI, Navigation Component для навигации и Hilt для внедрения зависимостей. Хороший пример применения принципов чистой архитектуры в модульном проекте.

  4. ChristopherME/movies-android

    Android playground-проект с модульностью по фичам (android libraries), unit-тестами, и архитектурами MVVM и MVI. Навигация выделена в отдельный core модуль, что является интересным подходом. Использует Jetpack Compose и Hilt, предоставляя практический пример для приложений с медиаконтентом.

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

    Демонстрационный проект, показывающий реализацию MVI с Kotlin Coroutines Flow и Jetpack Compose. Включает примеры с Dagger Hilt DI. Акцент сделан на чистую архитектуру и организацию навигации в многомодульном приложении.

  6. IsaacSufyan/Android-MVI-Architecture---Sample-App

    Образец приложения на MVI с использованием Jetpack Compose, StateFlow, Hilt и модульной навигации. Этот проект использует продвинутые инструменты для управления состоянием и навигацией, что делает его полезным для изучения современных подходов.

  7. RivuChk/Jetpack-Compose-MVI-Demo

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

  8. EduDev06/MVIComposeProject

    Репозиторий с многомодульной архитектурой (app, feature, core), где в feature-модулях применяется MVI, Jetpack Compose для UI, Navigation Component для навигации и Hilt для внедрения зависимостей. Включает примеры с Retrofit и Room, показывая интеграцию сетевых вызовов и локального хранения данных.

  9. ValeryPonomarenko/modular-navigation

    Демонстрационный проект, сфокусированный на модульной навигации в многомодульном Android-приложении. Реализована навигация между feature-модулями с использованием современного стека: Hilt для DI и Jetpack Compose для UI. Отличный ресурс для изучения специфики навигационных решений.

  10. naeemdev/Jetpack-Compose-MVI-Architecture

    Этот репозиторий реализует многомодульную структуру с выделением feature-модулей. В них используется MVI для управления состояниями и событиями, Jetpack Compose для UI, Navigation Component для навигации и Hilt для DI. Проект демонстрирует интеграцию этих технологий в простом, но полном приложении.


Визуализация архитектурных компонентов

Для лучшего понимания взаимодействия между ключевыми технологиями в современном Android-проекте, давайте рассмотрим следующую ментальную карту. Она иллюстрирует, как многомодульность, MVI, Jetpack Compose, Hilt и Навигация объединяются для создания robust-приложений.

mindmap root["Современная Android Архитектура на Kotlin"] id1["Многомодульность"] id1_1["app (Точка входа)"] id1_2["feature (Функциональные модули)"] id1_3["core/common (Общий код
утилиты)"] id2["MVI (Model-View-Intent)"] id2_1["Однонаправленный поток данных"] id2_2["Состояние (State)"] id2_3["Намерение (Intent)"] id2_4["Побочные эффекты (Side Effect)"] id3["Jetpack Compose"] id3_1["Декларативный UI"] id3_2["Компонуемые функции"] id3_3["Управление состоянием в UI"] id4["Hilt"] id4_1["Внедрение зависимостей"] id4_2["Упрощение Dagger"] id4_3["Интеграция с Jetpack"] id5["Навигация"] id5_1["Navigation Component"] id5_2["Координаторы навигации"] id5_3["Безопасность типов"] id5_4["Навигация между модулями"]

Эта карта показывает, что каждый компонент играет важную роль: многомодульность структурирует проект, MVI управляет состоянием, Compose строит UI, Hilt предоставляет зависимости, а Навигация связывает всё воедино.


Сравнительный анализ выбранных репозиториев

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

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


Ключевые архитектурные компоненты и их роли

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

Компонент Описание Преимущества
Многомодульность Разделение проекта на независимые, переиспользуемые модули (например, app, feature, core). Улучшенная скорость сборки, тестируемость, сопровождаемость, возможность параллельной разработки, инкапсуляция функционала.
MVI (Model-View-Intent) Архитектурный паттерн с однонаправленным потоком данных, где View отправляет Intent, Model обрабатывает его и обновляет State, который отображается View. Предсказуемое управление состоянием, четкое разделение ответственности, упрощение отладки, улучшенная тестируемость бизнес-логики.
Jetpack Compose Современный декларативный UI-фреймворк для Android, позволяющий описывать UI как функцию от состояния. Ускорение разработки UI, сокращение шаблонного кода, мощные инструменты для создания анимаций и кастомных компонентов, интуитивное управление состоянием UI.
Hilt Библиотека для внедрения зависимостей, построенная поверх Dagger и оптимизированная для Android. Стандартизация внедрения зависимостей, значительное снижение шаблонного кода Dagger, легкая интеграция с компонентами Android Jetpack, улучшенная тестируемость.
Навигация (в feature модулях) Управление переходами между экранами и функциональными блоками, особенно в контексте изолированных feature-модулей, часто с использованием Jetpack Navigation Component или координаторов. Обеспечение слабой связности между модулями, безопасная передача аргументов между экранами, возможность централизованного управления потоками пользовательского интерфейса.

Видеоурок по многомодульности

Для тех, кто предпочитает визуальное обучение, предлагаю ознакомиться с видеоуроком от Philipp Lackner, который подробно рассказывает об основах многомодульной архитектуры в Android. Хотя видео может не покрывать MVI или Compose в деталях, оно дает отличное представление о том, как начать структурировать ваше приложение на модули.

Видео: "Multi-module Android App Tutorial" от Philipp Lackner.

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


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

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

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

  • Ускорение времени сборки: Gradle может кэшировать неизмененные модули и пересобирать только измененные, что особенно заметно на больших проектах.
  • Улучшенная организация кода: Четкое разделение ответственности между модулями делает код более понятным и управляемым.
  • Повышенная масштабируемость и сопровождаемость: Легче добавлять новые функции или изменять существующие, не затрагивая другие части приложения.
  • Возможность параллельной разработки: Разные команды или разработчики могут независимо работать над разными модулями.
  • Инкапсуляция и слабая связанность: Модули могут скрывать детали своей реализации, предоставляя только публичный API, что уменьшает зависимости между ними.
  • Повторное использование кода: Общие модули (`core`, `library`) могут быть легко переиспользованы в других проектах.
  • Упрощенное тестирование: Каждый модуль можно тестировать изолированно.
Почему стоит использовать MVI с Jetpack Compose?

Комбинация MVI (Model-View-Intent) и Jetpack Compose является мощным подходом по нескольким причинам:

  • Однонаправленный поток данных: MVI обеспечивает строгий однонаправленный поток данных (State -> View, View -> Intent -> Model -> State). Это хорошо сочетается с декларативной природой Compose, где UI является функцией от состояния. Когда состояние изменяется, Compose автоматически перерисовывает только необходимые части UI.
  • Предсказуемость состояния: В MVI состояние UI является иммутабельным и единственным источником истины. Это упрощает отладку и понимание того, как и почему UI выглядит определенным образом в любой момент времени.
  • Четкое разделение ответственности: MVI помогает разделить логику управления состоянием (Model/ViewModel) от логики отображения (View/Compose UI).
  • Улучшенная тестируемость: Бизнес-логику и логику изменения состояния в MVI легко тестировать изолированно, так как они не зависят напрямую от фреймворка UI.
  • Обработка сложных пользовательских взаимодействий: MVI позволяет моделировать пользовательские взаимодействия как "намерения" (Intents), что помогает структурировать обработку сложных сценариев и побочных эффектов (side effects).
Как Hilt упрощает внедрение зависимостей в модульных проектах?

Hilt, построенный на основе Dagger, значительно упрощает внедрение зависимостей (DI) в Android-приложениях, особенно в многомодульных проектах:

  • Стандартные компоненты: Hilt предоставляет стандартный набор компонентов (например, `@SingletonComponent`, `@ActivityComponent`), что снижает необходимость вручную создавать и управлять Dagger-компонентами.
  • Уменьшение шаблонного кода: Hilt генерирует большую часть кода, необходимого для Dagger, что сокращает количество ручной настройки.
  • Интеграция с Jetpack: Hilt легко интегрируется с компонентами Jetpack, такими как ViewModel, WorkManager и Navigation. Например, с `@HiltViewModel` зависимости внедряются в ViewModel автоматически.
  • Поддержка скоупов (областей видимости): Hilt упрощает управление жизненным циклом зависимостей через предопределенные аннотации скоупов (например, `@Singleton`, `@ActivityScoped`).
  • Упрощенная настройка в модулях: В многомодульных проектах Hilt позволяет каждому модулю определять свои собственные зависимости и предоставлять их другим модулям через стандартные механизмы Dagger/Hilt. `@InstallIn` используется для указания, в какой Hilt-компонент должен быть установлен модуль Dagger.
  • Улучшенная тестируемость: Hilt облегчает замену зависимостей в тестах, позволяя легко внедрять мок-объекты.

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

Какие существуют подходы к навигации в многомодульных Android-приложениях?

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

  • Jetpack Navigation Component с Deep Links: `Feature`-модули могут определять свои собственные графы навигации, а переходы между модулями осуществляются через явные `Intent` с использованием `deep links`. Модуль `app` может координировать общую навигацию.
  • Интерфейсы навигации в `core` или `navigation` модуле: Каждый `feature`-модуль реализует интерфейс навигатора, определенный в общем модуле. Модуль `app` или специальный модуль-координатор связывает эти реализации. Это позволяет `feature`-модулям запрашивать навигацию, не зная о конкретных реализациях других модулей.
  • Использование Reflection или Service Locator: Менее предпочтительные, но возможные подходы, где навигационные пути или обработчики регистрируются и запрашиваются динамически.
  • Специализированный `navigation` модуль: Этот модуль может содержать все графы навигации или абстракции для навигации, от которых зависят `feature`-модули. Это может привести к тому, что `navigation` модуль будет знать обо всех `feature`-модулях.
  • Координаторы навигации (Navigation Coordinators): Паттерн, где отдельные классы-координаторы отвечают за логику навигации для определенного потока или `feature`. Координаторы могут быть иерархическими.

Выбор подхода зависит от сложности приложения и требований к степени изоляции модулей. Важно минимизировать прямые зависимости между `feature`-модулями.


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


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


Last updated May 19, 2025
Ask Ithy AI
Download Article
Delete Article