Быстрое создание 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 актуальных версий.
Установка и создание проекта
- Установите Android Studio (актуальную версию), SDK, эмулятор и опциональный NDK.
- New Project → выберите Empty Activity (или No Activity для Compose).
- Name: MyAwesomeApp; Package: com.example.myawesomeapp; Language: Kotlin; Minimum SDK: API 24+.
- 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 по необходимости.
С таким подходом вы получите читаемую, тестируемую и масштабируемую кодовую базу: начинайте с простого шаблона, добавляйте модули и автоматизацию по мере роста команды.