Быстрое создание Android‑проекта и правильная структура (MVVM + Compose)

В двух словах: создайте проект через New Project в Android Studio (Kotlin, Minimum SDK ≈ API 24), подключите Compose, Navigation и Coroutines в Gradle, затем оформите код по MVVM + слоистой (data/domain/ui) структуре с DI (Hilt) и модульностью по фичам — это даст масштабируемую основу.

Если вы хотите стартовать быстро — выберите Empty Activity (или No Activity для чистого Compose), Kotlin и AGP/Gradle актуальных версий.

Установка и создание проекта

  1. Установите Android Studio (актуальную версию), SDK, эмулятор и опциональный NDK.
  2. New Project → выберите Empty Activity (или No Activity для Compose).
  3. Name: MyAwesomeApp; Package: com.example.myawesomeapp; Language: Kotlin; Minimum SDK: API 24+.
  4. Finish — студия создаст базовую структуру.

Не меняйте package name вручную после первого билда — при необходимости используйте Refactor > Rename.

Настройка Gradle и зависимости

В модуле app используйте Kotlin DSL (build.gradle.kts). Подключите Compose BOM, navigation-compose, lifecycle и корутины. Пример зависимостей:

dependencies {
    implementation("androidx.core:core-ktx:1.13.1")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.4")
    implementation("androidx.activity:activity-compose:1.9.1")
    implementation(platform("androidx.compose:compose-bom:2024.06.00"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.material3:material3")
    implementation("androidx.navigation:navigation-compose:2.8.0")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1")
}

Рекомендуемые настройки:

  • AGP 8.2+ (или актуальная) и Gradle 8.x.
  • Включите koin/ Hilt для DI; Hilt — стандарт для крупных проектов.
  • Настройте стандартные flavor/proguard правила и lint.

Архитектура и структура папок (MVVM + Clean)

Организуйте проект по слоям, чтобы UI не зависел от деталей доступа к данным.

Рекомендуемая базовая структура: app/src/main/java/com/example/myawesomeapp/

  • data/
    • local/ (Room, DAO)
    • remote/ (Retrofit ApiService)
    • repository/ (реализации репозиториев)
  • domain/
    • model/ (сущности)
    • usecase/ (интеракторы)
  • ui/
    • main/ (MainActivity, NavHost)
    • screens/ (HomeScreen, ProfileScreen)
    • components/ (повторно используемые композаблы)
  • di/ (модули Hilt)

Почему так:

  • отделение domain упрощает тестирование;
  • data можно заменить моками;
  • ui содержит только представление и ViewModel.

Пример простого NavHost (Compose):

@Composable
fun AppNavHost(navController: NavHostController) {
    NavHost(navController, startDestination = "home") {
        composable("home") { HomeScreen() }
        composable("profile/{userId}") { backStackEntry ->
            val userId = backStackEntry.arguments?.getString("userId")
            ProfileScreen(userId)
        }
    }
}

Модульность, тесты и CI

  • Разбейте на feature-модули (:feature:home, :feature:profile) при росте >10 экранов.
  • Покрытие: unit-тесты для domain, unit + instrumentation/UI для критичных экранов. Используйте Turbine для Flow.
  • CI: ./gradlew test, lint, assembleDebug. Автоматизируйте сборки и релизы.

В 2026 году стоит учитывать Compose Multiplatform: выделяйте commonMain, если планируете мультиплатформу.

Частые ошибки

  • Ставить Minimum SDK слишком низко — теряются API и оптимизация. Оптимально API 24+.
  • Писать бизнес‑логику во View/Activity — тестировать сложно.
  • Жёстко связывать ViewModel с конкретной реализацией репозитория (не через интерфейс).
  • Не настраивать lint/ktlint — технический долг растёт быстро.

FAQ

  • Нужно ли сразу добавлять Hilt? Да — DI проще внедрять в начале; позже рефакторить дороже.
  • Как разделять модули? По фичам: UI+domain+data внутри feature-модуля, общий UI/utility — в core.
  • Какой стартовый набор зависимостей? Compose, Navigation, Lifecycle, Coroutines, Retrofit/Room по необходимости.

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