Структура проекта 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 — тогда проект останется масштабируемым и предсказуемым.