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.2024https://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, для releasefalse).

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"
Вопросы на собесе