Структура проекта Android Studio, модули и Gradle — кратко и по делу

Проект в Android Studio основан на Gradle: корневая папка хранит глобальные настройки (settings.gradle, project-level build.gradle, gradle.properties), а каждый модуль (app, библиотека) имеет собственный module-level build.gradle и папку src. Это обеспечивает повторяемую сборку, разделение кода и возможность собрать отдельные части независимо.

Структура проекта — что где лежит и зачем

  • Корень проекта:
    • settings.gradle(.kts) — список модулей (include ':app', ':feature:auth').
    • build.gradle(.kts) (project-level) — подключение плагинов Gradle, classpath AGP.
    • gradle.properties — глобальные флаги (android.useAndroidX=true, org.gradle.jvmargs).
    • gradle/wrapper — gradle-wrapper.jar и wrapper properties для воспроизводимости.
  • Модуль app (/app):
    • src/main/java или kotlin — исходники.
    • src/main/res — layouts, drawables, values.
    • AndroidManifest.xml — декларация Activity/Service/permissions.
    • build.gradle(.kts) (module-level) — namespace, compileSdk, defaultConfig, dependencies.
  • Другие файлы: proguard-rules.pro, .gitignore, local.properties (локальные пути к SDK — не коммитить).

Практическая проверка: откройте settings.gradle — увидите все модули; ./gradlew :app:assembleDebug соберёт только app.

Проверьте local.properties перед коммитом: он локальный и не должен попадать в репозиторий.

Модули: типы, как подключать и когда их делать

Модуль — самостоятельный артефакт с собственным build.gradle. Типы и сценарии:

  • com.android.application — основной APK/entrypoint (app).
  • com.android.library — AAR, общие UI/логика (ui:components).
  • com.android.dynamic-feature — динамически загружаемые фичи.
  • java-library / kotlin-jvm — чистая библиотека для non-Android кода (network, util).

Как подключить модуль:

  • В settings.gradle добавьте include ':feature:auth'
  • В app/build.gradle: implementation project(':feature:auth')

Когда разделять на модули:

  • Повторно используемый UI или data-слой.
  • Когда команда параллельно работает над фичами.
  • Для ускорения инкрементальных сборок (но >20 модулей требует управления конфигурацией).

Минусы: конфигурационный overhead, сложнее CI. Начните с 2–5 модулей, затем разделяйте по границам ответственности.

Gradle: ключевые настройки и советы на практике

Основы:

  • Используйте Gradle Wrapper: ./gradlew assembleRelease.
  • Project-level: задаёт classpath плагинов (com.android.tools.build:gradle).
  • Module-level: plugins { id 'com.android.application' } и блок android { compileSdk, defaultConfig, buildTypes }. Примеры полезных опций:
  • productFlavors — сборки free/pro.
  • signingConfigs — подпись релизов.
  • kotlinOptions { jvmTarget = "17" } и compileOptions для Java 17.
  • Используйте Version Catalogs и центральный файл зависимостей для единообразия.

Оптимизация сборки:

  • Включайте R8 и baseline profiles.
  • Используйте build cache и конфигурацию параллельной сборки.
  • Разделяйте модули так, чтобы инкрементальные изменения влияяли минимально.

Не используйте плавающие версии вроде "1.+" или символы '!' — это ломает reproducible builds.

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

  • Duplicate class: проверьте transitives и исключите дубли (exclude group/module).
  • Manifest merger failed: конфликты с одинаковыми permission/authority — исправьте tools:replace или переосмыслите модули.
  • Task failed / OOM при сборке: увеличьте org.gradle.jvmargs в gradle.properties или очистите кеш ./gradlew cleanBuildCache.
  • KAPT/annotation processor: добавьте correct kapt/annotationProcessor конфигурации и включите incremental KAPT.

FAQ

  • Как добавить новый модуль? File > New > New Module или вручную — добавить папку, module build.gradle и include в settings.gradle.
  • Как протестировать модуль отдельно? ./gradlew :moduleName:assembleDebug или запустить unit/instrumented тесты ./gradlew :moduleName:testDebugUnitTest.
  • Как ускорить CI сборки? Кешируйте ~/.gradle и .gradle/caches, используйте инкрементальные сборки и сборку AAB только для релизов.
  • С чего начать изучение архитектуры в примерах? Посмотрите много-модульные проекты (Now in Android), базовые samples с Room/ViewModel и проекты с разделением app/data/ui — изучите их структуру и Gradle-организацию.

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