Gradle
https://docs.gradle.org/current/userguide/compatibility.html |
https://docs.gradle.org/current/userguide/build_environment.html |
https://r8-docs.preemptive.com/ |
17.09.2024 | https://habr.com/ru/companies/tbank/articles/843648/ |
Gradle
Инструмент автоматизации сборки.
libs.versions.toml
Файл конфигурации для Version Catalogs в Gradle, который помогает централизованно управлять зависимостями и версиями библиотек в проекте. Этот файл позволяет создавать алиасы для зависимостей, устанавливать их версии и описывать наборы библиотек, что упрощает управление версиями в многомодульных проектах.
[versions]
kotlin = "2.0.21"
coroutines = "1.9.0"
[libraries]
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
coroutine-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
[bundles]
coroutines = ["coroutines-core", "coroutines-android"]
[plugins]
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
[versions]
Задаёт версии для библиотек, чтобы их можно было ссылаться по имени.
[versions]
agp = "8.7.2"
kotlin = "2.0.21"
androidx-activity = "1.9.3"
androidx-collection = "1.4.5"
[libraries]
Создаёт алиасы для зависимостей с указанием версии из [versions]
или напрямую.
[libraries]
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity" }
androidx-collection = { module = "androidx.collection:collection", version.ref = "androidx-collection" }
[bundles]
Объединяет несколько зависимостей в один набор для удобного подключения.
[bundles]
androidx = ["androidx-activity-compose", "androidx-collection"]
[plugins]
Определяет плагины с их ID и версией, чтобы подключать их централизованно.
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
build.gradle.kts
(top level)
Главный файл Gradle-сборки, находящийся в корневой директории проекта Android. Он настраивает параметры, которые применяются ко всему проекту, такие как подключение плагинов, репозиториев и зависимостей, и позволяет управлять глобальными настройками, которые будут доступны всем модулям проекта.
plugins {
}
allprojects {
}
subprojects {
}
plugins
Подключаются плагины необходимые для проекта.
• apply false
означает, что плагины не будут автоматически применены ко всему проекту, но они будут доступны для применения в каждом модуле. Это помогает избежать конфликта версий плагинов и позволяет лучше контролировать, где именно используются плагины.
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.kotlin.parcelize) apply false
alias(libs.plugins.kotlin.compose) apply false
}
allprojects
Позволяет задать настройки, которые применяются ко всем подпроектам.
allprojects {
...
}
subprojects
Позволяет задать настройки, которые применяются ко всем модулям.
subprojects {
...
}
build.gradle.kts
(module level)
Конфигурационный файл Gradle, который определяет настройки и зависимости для конкретного модуля в Android-проекте. Он управляет параметрами сборки, подключением библиотек и плагинов, а также настройками, специфичными для этого модуля.
plugins {}
kotlin {}
android {}
dependencies {}
base {}
plugins
Подключает необходимые плагины.
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.google.ksp)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.kotlin.parcelize)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}
kotlin
Используется для настройки параметров компилятора Kotlin на уровне модуля.
kotlin {
...
}
jvmToolchain
Задает версию JVM, на которой будет работать компилятор Kotlin.
kotlin {
jvmToolchain(17)
}
android
Содержит конфигурации, специфичные для Android.
android {
namespace = "org.michaelbel.app"
compileSdk = 35
defaultConfig {}
buildFeatures {}
kotlinOptions {}
compileOptions {}
buildTypes {}
signingConfigs {}
}
namespace
Определяет пространство имён (package name) для сгенерированного кода (например, R
-классы для ресурсов или BuildConfig
). Позволяет разделить пространство имён приложения и его модуля. Также помогает избежать дублирования пространства имён при многомодульной структуре, так как каждый модуль может иметь своё уникальное пространство имён.
android {
namespace = "org.michaelbel.app"
}
compileSdk
Задает версию API Android, с которой компилируется приложение.
android {
compileSdk = 35
}
defaultConfig
Определяет базовые параметры для всех сборок в модуле (например, debug, release и других кастомных).
• applicationId
уникальный идентификатор приложения в формате пакета Java (например, com.example.myapp).
• minSdk
минимальная версия API Android, которую поддерживает приложение.
• targetSdk
версия API Android, на которую нацелено приложение.
• versionCode
целочисленный внутренний номер версии приложения.
• versionName
строка, представляющая пользовательскую версию приложения.
• testInstrumentationRunner
указывает на класс, который запускает инструментальные тесты Android.
android {
defaultConfig {
applicationId = "org.michaelbel.app"
minSdk = 21
targetSdk = 35
versionCode = 1
versionName = "1.0.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
}
buildFeatures
Позволяет включать или отключать некоторые функции Android.
• resValues
отключает генерацию значений ресурсов в модуле.
• shaders
отключает обработку шейдеров GLSL
в модуле.
• aidl
отключает поддержку AIDL
в модуле.
• renderScript
отключает поддержку RenderScript
в модуле.
• viewBinding
включает ViewBinding
в модуле.
• dataBinding
отключает DataBinding
в модуле.
android {
buildFeatures {
resValues = true
shaders = false
aidl = false
renderScript = false
buildConfig = true
compose = true
}
}
kotlinOptions
Используется для настройки различных параметров компиляции кода на Kotlin.
• jvmTarget
определяет версию JVM, на которую будет компилироваться код Kotlin.
• freeCompilerArgs
список дополнительных аргументов для компилятора Kotlin. Здесь можно задать флаги для оптимизации, включения специфических фич или устранения предупреждений.
• allWarningsAsErrors
делает так, что все предупреждения компилятора Kotlin считаются ошибками.
• apiVersion
задает минимальную версию API Kotlin.
• languageVersion
задает используемую версии языка Kotlin.
android {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = freeCompilerArgs + listOf(
"-Xopt-in=kotlin.RequiresOptIn",
"-Xjvm-default=all",
"-opt-in=androidx.compose.material3.ExperimentalMaterial3Api"
)
allWarningsAsErrors = true
apiVersion = "1.5"
languageVersion = "1.5"
}
}
compileOptions
Используется для настройки параметров компиляции Java в Android проекте, чтобы управлять совместимостью с различными версиями Java.
• sourceCompatibility
задает минимальную версию Java, с которой будет совместим исходный код.
• targetCompatibility
указывает версию Java для выходного файла. Обычно задается такая же версия, как sourceCompatibility, чтобы скомпилированный код работал на выбранной целевой версии JVM.
• encoding
устанавливает кодировку для компиляции. Обычно используется "UTF-8", чтобы избежать проблем с символами в строках и комментариях.
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
encoding = "UTF-8"
}
}
buildTypes
Определяет различные типы сборок (например, debug и release), каждая из которых имеет свои настройки и параметры.
• applicationIdSuffix
добавляет суффикс к applicationId
, чтобы отличать разные типы сборок. Например, для debug
можно установить суффикс .debug
, чтобы отличать его от release
.
• versionNameSuffix
добавляет суффикс к versionName
, что позволяет отличить версию сборки, например, 1.0.0-debug
.
• isMinifyEnabled
указывает, нужно ли уменьшать размер кода с помощью обфускации и удаления неиспользуемого кода. Обычно включается для release
сборок, чтобы минимизировать размер APK.
• isShrinkResources
позволяет уменьшить размер APK за счет удаления неиспользуемых ресурсов, таких как изображения, строки и другие ресурсы, которые не используются в приложении. Это особенно полезно для release
-сборок, где важен минимальный размер приложения.
• isDebuggable
указывает, может ли сборка запускаться с отладчиком. Обычно для debug
-сборки выставляется в true
, чтобы включить отладочные возможности.
• proguardFiles
cписки файлов ProGuard
, которые используются для обфускации и оптимизации кода. Обычно для release
-сборки указываются специальные файлы ProGuard
, такие как proguard-android-optimize.txt
и proguard-rules.pro
.
• signingConfig
задает конфигурацию подписывания приложения. Для release
обычно используется signingConfig
, чтобы подписывать приложение для публикации.
• initWith
инициализирует buildType
настройками другого buildType
.
android {
buildTypes {
debug {
applicationIdSuffix = ".debug"
versionNameSuffix = ".debug"
isMinifyEnabled = false
isShrinkResources = false
isDebuggable = true
}
release {
isMinifyEnabled = true
isShrinkResources = true
isDebuggable = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
signingConfig = signingConfigs.getByName("release")
}
create("qa") {
initWith(buildTypes.getByName("release"))
}
}
}
signingConfigs
Используется для определения конфигураций подписи приложения в Android. Подпись приложения обязательна для публикации в Google Play и позволяет обеспечить целостность и безопасность приложения, поскольку только подписанное приложение может обновляться на устройстве.
• storeFile
путь к файлу хранилища ключей (обычно .keystore
-файл), используемого для подписи.
• storePassword
пароль для доступа к хранилищу ключей.
• keyAlias
псевдоним ключа, под которым хранится конкретный ключ внутри хранилища.
• keyPassword
пароль для доступа к ключу внутри хранилища.
android {
signingConfigs {
create("release") {
storeFile = file("path/to/your/keystore.jks")
storePassword = "storePassword"
keyAlias = "yourKeyAlias"
keyPassword = "keyPassword"
}
}
}
dependencies
Определяет зависимости, необходимые для работы модуля.
• implementation
зависимость доступна только в текущем модуле.
• api
зависимость передаётся в модули, которые зависят от текущего.
• compileOnly
зависимость доступна при компиляции, но не включается в APK.
• runtimeOnly
зависимость добавляется только в рантайм, без компиляции.
• kapt
используется для Java-аннотаций.
• ksp
генерирует код напрямую, не создавая Java-байткод.
dependencies {
implementation(project(":core"))
api(libs.androidx.appcompat)
}
exclude
Исключает определенные транзитивные зависимости, чтобы предотвратить конфликты или уменьшить размер сборки.
dependencies {
implementation("com.example:library:1.0") {
exclude(group = "com.unwanted", module = "unnecessary-lib") // Исключает модуль
exclude(group = "com.unwanted") // Исключает всю группу
}
}
base
Используется для настройки имени выходных архивов.
archivesName
Задаёт имя артефакта, который будет создан в процессе сборки проекта.
base {
archivesName.set("Mobile-Template-v${android.defaultConfig.versionName}(${android.defaultConfig.versionCode})")
}
settings.gradle.kts
Файл конфигурации для Gradle, который используется для настройки проекта и его модулей. Определяет структуру и особенности самого проекта и управляет загрузкой модулей, плагинов и репозиториев. В многомодульных проектах он особенно важен, так как помогает Gradle понять, какие модули включены и как они связаны друг с другом.
pluginManagement {
}
dependencyResolutionManagement {
}
include(":app")
rootProject.name = "MyApp"
pluginManagement
Используется для управления подключением и конфигурацией плагинов на уровне проекта. Он позволяет централизованно определить репозитории для загрузки плагинов и указать их версии, что особенно полезно в многомодульных проектах, так как избавляет от необходимости задавать плагины и их версии в каждом модуле отдельно.
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement
Позволяет централизованно управлять зависимостями и репозиториями для всех модулей проекта. Это особенно полезно для многомодульных проектов, так как упрощает настройку репозиториев и версий зависимостей, делая их единообразными для всех модулей.
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}
include
Позволяет указать, какие модули включены в сборку.
include(":app", ":library", ":feature_module")
rootProject.name
Определяет имя корневого проекта.
rootProject.name = "MyApp"
gradle.properties
Файл конфигурации Gradle
, в котором можно задавать параметры, влияющие на сборку Android-приложения. Этот файл используется для управления поведением сборки, настройки переменных и оптимизации производительности.
org.gradle.jvmargs=-Xmx8192m -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.caching=true
org.gradle.warning.mode=all
org.gradle.logging.level=info
android.useAndroidX=true
android.enableJetifier=false
android.enableR8=true
android.enableBuildCache=false
android.defaults.buildFeatures.resValues=true
android.defaults.buildFeatures.shaders=false
android.defaults.buildFeatures.aidl=false
android.defaults.buildFeatures.renderscript=false
android.defaults.buildFeatures.viewBinding=false
android.defaults.buildFeatures.dataBinding=false
CI=true
org.gradle.jvmargs
Параметры JVM для процесса Gradle
.
• Xmx8192m
задаёт максимальный размер кучи памяти JVM, которую может использовать Gradle
, равный 8192 МБ (8 ГБ).
• Dfile.encoding=UTF-8
устанавливает кодировку файлов, используемую JVM, в UTF-8.
org.gradle.jvmargs=-Xmx8192m -Dfile.encoding=UTF-8
org.gradle.daemon
Позволяет использовать Gradle Daemon, который ускоряет повторные сборки за счёт использования демона в фоне.
org.gradle.daemon=true
org.gradle.parallel
Включает параллельную сборку модулей, что сокращает время сборки.
org.gradle.parallel=true
org.gradle.configureondemand
Конфигурация по требованию, активирует только те модули, которые необходимы для сборки.
org.gradle.configureondemand=true
org.gradle.caching
Включает кэширование задач Gradle
для более быстрой сборки.
org.gradle.caching=true
org.gradle.warning.mode
Выводит все предупреждения Gradle
, что полезно для отладки проблем.
org.gradle.warning.mode=all
org.gradle.logging.level
Задаёт уровень логирования для вывода в консоль.
org.gradle.logging.level=info
android.useAndroidX
Переводит проект на AndroidX, чтобы использовать новые библиотеки поддержки.
android.useAndroidX=true
android.enableJetifier
Автоматически конвертирует зависимости, использующие старые библиотеки поддержки, на AndroidX. Полезно при миграции проекта.
android.enableJetifier=true
android.enableR8
Включает использование R8 для обфускации и минимизации кода. R8 — это замена ProGuard, которая является более производительной.
android.enableR8=true
android.enableBuildCache
Включает кэширование сборки, что позволяет сократить время при повторных сборках.
android.enableBuildCache=true
android.defaults.buildFeatures
Управляют включением и отключением различных функций сборки в Android Gradle Plugin.
• resValues
отключает генерацию значений ресурсов.
android.defaults.buildFeatures.resValues=false
• shaders
отключает обработку шейдеров GLSL
в проекте.
android.defaults.buildFeatures.shaders=false
• aidl
отключает поддержку AIDL
.
android.defaults.buildFeatures.aidl=false
• renderscript
отключает поддержку RenderScript
, который используется для вычислений и обработки изображений.
android.defaults.buildFeatures.renderscript=false
• viewBinding
включает ViewBinding
, который генерирует привязки для каждого layout
-файла.
android.defaults.buildFeatures.viewBinding=true
• dataBinding
отключает DataBinding
, который позволяет связывать данные в XML-файлах с логикой в Kotlin или Java.
android.defaults.buildFeatures.dataBinding=false
CI
Используется как индикатор того, что проект собирается на CI/CD. Может влиять на логику сборки.
CI=true
gradle-wrapper.properties
Файл, который конфигурирует Gradle Wrapper для проекта. Gradle Wrapper — это скрипт, который позволяет автоматически загрузить нужную версию Gradle
, если она не установлена на локальной машине. Это полезно для унификации версий Gradle
между разработчиками и в CI/CD средах, так как все будут использовать одну и ту же версию Gradle
, настроенную в проекте.
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
distributionBase
Определяет основное местоположение, где будет храниться загруженный дистрибутив Gradle
(файл .zip), необходимый для работы Gradle Wrapper.
distributionBase=GRADLE_USER_HOME
distributionUrl
Определяет URL для загрузки конкретной версии Gradle
. Здесь можно указать стабильную версию, nightly-сборку или версию из канала предварительных релизов.
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
distributionPath
Указывает путь для сохранения загруженной версии Gradle
. По умолчанию этот параметр сохраняет Gradle в кэш в директории .gradle
в домашней папке.
distributionPath=wrapper/dists
zipStorePath
Определяет путь, где сохраняются файлы Gradle
после загрузки.
zipStorePath=wrapper/dists
zipStoreBase
Определяет местоположение, где будет храниться уже распакованный архив с дистрибутивом Gradle
.
zipStoreBase=GRADLE_USER_HOME
local.properties
Конфигурационный файл в Android-проектах, который хранит настройки и параметры, специфичные для локальной среды разработки. Этот файл не попадает в систему контроля версий. Автоматически создаётся при запуске Android Studio или Gradle.
sdk.dir=/Users/mihailbelyj/Library/Android/sdk
sdk.dir
Указывает путь к Android SDK на локальной машине. Gradle использует это значение для поиска и работы с SDK, поэтому этот параметр обязателен для сборки Android-проектов.
sdk.dir=/Users/michaelbel/Library/Android/sdk
ndk.dir
Указывает путь к Android NDK, если проект использует нативный код на C/C++. Это позволяет Gradle находить NDK и использовать его для сборки нативных библиотек.
ndk.dir=/Users/username/Library/Android/ndk
cmake.dir
Задаёт путь к CMake, если проект использует сборку нативного кода с помощью CMake. Указание пути к CMake позволяет Gradle использовать правильную версию.
cmake.dir=/Users/username/Library/Android/cmake
BuildConfig
Автоматически сгенерированный класс в Android-проектах, который содержит информацию о конфигурации сборки приложения. Он создается Gradle при сборке проекта и включает в себя различные поля, такие как версию приложения, его идентификатор пакета, тип сборки и другие параметры, которые можно использовать в коде.
BuildConfig.BUILD_TYPE
Строка, показывающая тип сборки, например, debug
или release
.
val buildType = BuildConfig.BUILD_TYPE
BuildConfig.DEBUG
Логическое значение, которое указывает, выполняется ли приложение в режиме отладки (для сборок debug
это true
, для release
— false
).
val isDebug = BuildConfig.DEBUG
BuildConfig.VERSION_CODE
Целочисленное значение, представляющее версию сборки.
val versionCode = BuildConfig.VERSION_CODE
BuildConfig.VERSION_NAME
Строковое значение, представляющее версию приложения (например, «1.0»).
val versionName = BuildConfig.VERSION_NAME
BuildConfig.APPLICATION_ID
Уникальный идентификатор пакета приложения, определённый в файле build.gradle
. Используется для идентификации приложения в системе Android.
val appId = BuildConfig.APPLICATION_ID
Настройка собственных параметров в BuildConfig
• В модуль build.gradle.kts
добавить:
android {
defaultConfig {
buildConfigField("String", "API_URL", "\"https://api.example.com\"")
}
buildFeatures {
buildConfig = true
}
}
• Использовать в коде:
val apiUrl = BuildConfig.API_URL
• Пример использования параметров из local.properties
или из GitHub Secrets variables (для CI):
# Переменная в файле local.properties
API_KEY=8j9f-3c3d-490eh-f9j3-kfk9
import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
private val apiKey: String by lazy {
gradleLocalProperties(rootDir, providers).getProperty("API_KEY").orEmpty().ifEmpty { System.getenv("API_KEY").orEmpty() }
}
android {
defaultConfig {
buildConfigField("String", "API_KEY", "\"$apiKey\"")
}
buildFeatures {
buildConfig = true
}
}
Commands
build warning mode all
./gradlew build --warning-mode=all
dependencies
Выводит список всех зависимостей проекта, их версии и зависимости внутри модулей, а также разрешённые и транзитивные зависимости. Это помогает увидеть полную структуру иерархии зависимостей проекта и выявить возможные конфликты версий.
./gradlew dependencies
signinReport
Генерирует отчет о ключах подписи приложения, включая отпечатки (SHA-1 и SHA-256) для всех buildType и flavor. Эти отпечатки часто требуются для интеграции с сервисами, такими как Firebase или Google API, чтобы обеспечить аутентификацию приложений.
./gradlew signinReport
tasks
Выводит список всех доступных задач Gradle в проекте, сгруппированных по категориям (например, сборка, проверка, сборка документации). Она помогает узнать, какие задачи можно запустить для сборки, тестирования, чистки и других действий в проекте.
./gradlew tasks
lint
Запускает анализ кода (Lint) в Android-проекте. Lint проверяет код на наличие потенциальных ошибок, проблем с производительностью, нарушений стиля, возможных утечек памяти и других проблем. Результаты анализа выводятся в виде отчёта, что помогает улучшить качество кода и следовать лучшим практикам.
./gradlew lint
assembleDebug
Cобирает APK для debug-сборки приложения. Эта сборка предназначена для тестирования и отладки, поэтому она включает отладочную информацию и не подписана релизным ключом. Сгенерированный APK находится в папке build/outputs/apk/debug и может быть установлен на устройство для тестирования.
./gradlew assembleDebug
assembleRelease
Cобирает release-сборку APK. Эта сборка оптимизирована для выпуска: она может быть обфусцирована, сжата и подписана релизным ключом (если настроено). Release-версия APK находится в папке build/outputs/apk/release и готова для распространения, например, через Google Play или другие магазины приложений.
./gradlew assembleRelease
installDebug
Cобирает и устанавливает debug-сборку APK на подключённое устройство или эмулятор. Эта версия приложения включает отладочную информацию и позволяет быстро тестировать последние изменения. APK автоматически устанавливается и запускается на устройстве, если это предусмотрено настройками.
./gradlew installDebug
installRelease
Cобирает и устанавливает release-сборку APK на подключённое устройство или эмулятор. Эта версия оптимизирована для выпуска, без отладочной информации. Поскольку это release-сборка, её установка возможна только при наличии подходящего ключа подписи или если устройство позволяет установку неподписанных APK для тестирования.
./gradlew installRelease
java version
Отображает текущую версию установленной Java.
java -version
printenv
Отображает все текущие переменные окружения и их значения в вашей системе. Переменные окружения содержат информацию, такую как пути к системным каталогам, текущий пользователь, настройки языка, переменные конфигурации для приложений и сервисов и многое другое.
printenv
export env
Устанавливает переменную окружения JAVA_HOME для текущей сессии терминала.
• Переменная среды хранится в /usr/libexec/java_home
. Там указана последняя версия Java.
• Чтобы последней была 17 нужно удалить новые версии в Library/Java/JavaVirtualMachines
.
export JAVA_HOME="/Users/mihailbelyj/Library/Java/JavaVirtualMachines/corretto-17.0.10/Contents/Home"