
Непонимание того, как работает Gradle, может затруднить процесс разработки и превратить отладку проблем, связанных с Gradle, в кошмар для разработчика. В этой статье попытаемся дать общий обзор того, как этот инструмент сборки работает в целом и в частности в экосистеме Android.
Общие сведения
Gradle — это инструмент сборки, который базируется на концепциях более старых инструментов, таких как Apache Maven и Ant. Его использование DSL (предметно-ориентированного языка) устраняет необходимость в громоздких и длинных XML-файлах и позволяет разработчику только объявлять, что должно происходить во время сборки, используя особый и чистый синтаксис. Логику сборки следует определять только в плагинах, чтобы ограничить файл конфигурации сборки лишь объявлениями данных, хотя Gradle пока не считает это ошибкой.
Структура Gradle
Gradle работает в основном посредством задач и плагинов — комбинаций задач и их конфигураций. Входными данными задачи могут быть файлы или каталоги, а также любые другие данные Java-типа, но результатом служат только каталоги или файлы, записываемые на диск. Кроме того, если определяется задача, которая принимает результат другой задачи в качестве входных данных, мы создаем зависимость, и первая задача должна запускаться до начала выполнения другой.
Жизненный цикл Gradle
Сборка в Gradle выполняется в 3 этапа:
- Инициализация.
- Конфигурация.
- Выполнение.
Пример конфигурации на DSL
Следующий пример показывает, как можно задать конфигурацию для Android-части приложения:
android {
namespace = "com.example.app"
compileSdk = 34
// …
defaultConfig {
applicationId = "com.example.app"
minSdk = 34
// …
}
}
Этот код, по сути, преобразуется в классы с такими же элементами данных и соответствующими функциями.
Внешние зависимости
Одной из важных функций Gradle является управление зависимостями. Все, что нужно сделать, — это объявить зависимость в формате group:artifact:version (название-компании:название-библиотеки:версия), и Gradle выполнит поиск в настроенных репозиториях, например, в Maven-репозитории. Если зависимость найдется в объявленных репозиториях, она загрузится и добавится в сборку.
Варианты сборки и Build Flavors
Gradle позволяет объявлять варианты сборки, такие как release и debug, для различных конфигураций приложения. Например, тип сборки debug не обфусцирует Android-приложение, что приводит к более быстрой сборке. Технология Build Flavors также позволяет создавать различия на уровне приложения для каждого набора исходного кода, например, для различных версий приложения, таких как платная и бесплатная.
Файлы, связанные со сборкой в Android Studio
В Android Studio есть множество файлов, связанных с системой сборки Gradle. Некоторые из них никогда не следует изменять:
- ./gradle: файлы кэша для дистрибутива Gradle (управляются оберткой Gradle), файлы проекта и конфигурационные файлы.
- .idea: метаданные IDE.
- build.gradle.kts (в корне): объявления classpath-плагинов для всех подпроектов.
- gradle.properties: содержит свойства Gradle, а также временные свойства Android.
- gradlew.bat: загружает указанную версию Gradle и перенаправляет команды в загруженный дистрибутив Gradle (если доступно).
- local.properties: содержит свойства, связанные с вашим локальным компьютером.
- settings.gradle.kts: содержит глобальную информацию о сборке для инициализации и конфигурации Gradle.
- gradle/libs.version.toml: объявленные зависимости во всех подпроектах.
- gradle/wrapper/gradle-wrapper.jar: загружает указанный дистрибутив Gradle и запускает его.
- gradle/wrapper/gradle-wrapper.properties: указывает версию и место загрузки дистрибутива Gradle.
- subprojects: любой каталог с файлом build.gradle, включенный в settings.gradle.kts.
- subproject/build.gradle.kts: объявления плагинов + блоки конфигурации для подключенных плагинов + зависимости.
- src/* : файлы, связанные с проектом.
- app/proguard-rules.pro: определяет правила для управления операциями R8.
Основные компоненты сборки в Android:
- Исходный код: код, которым вы управляете.
- Зависимости библиотек: внешние библиотеки, используемые в проекте.
- Инструменты: компиляторы, плагины и SDK.
Ниже представлен упрощенный процесс того, что происходит при нажатии кнопки Run в Android Studio, с фокусом на Kotlin Android Plugin:
- Запускается gradlew.bat.
- Запускается gradle-wrapper.jar и читается gradle-wrapper.properties для проверки необходимости загрузки дистрибутива Gradle; либо производится запуск для вызова демона Gradle.
- Демон Gradle находит расположение JVM в .idea/gradle.xml и использует его при необходимости (передается в gradlew через Android Studio).
- Применяется Kotlin Android Plugin, читаются соответствующие блоки конфигурации (как показано ниже) и регистрируются связанные с ним задачи.
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
- Gradle выполняет задачи и компилирует файлы проекта.
- Затем Android Gradle Plugin (AGP) получает выходные данные плагина и преобразует их в DEX-файлы в рамках другой зарегистрированной задачи, которую выполняет Gradle.
Заключение
Данная статья лишь поверхностно затрагивает инструмент сборки Gradle и то, как он интегрирован в Android Studio для сборки Android-проектов. Хотя он гораздо более многофункционален, в большинстве случаев Android-разработчикам для управления проектами достаточно знакомства с концепциями высокого уровня, подобными рассмотренным здесь. Удачи в работе!
Читайте также:
- Отладка зависимостей в Gradle
- 6 рекомендаций по запуску современной кодовой базы Android с нуля
- Как использовать управляемые Gradle устройства с собственными девайсами
Читайте нас в Telegram, VK и Дзен
Перевод статьи Salma Khodaei: Understanding Gradle in Android Projects





