gradle

Непонимание того, как работает Gradle, может затруднить процесс разработки и превратить отладку проблем, связанных с Gradle, в кошмар для разработчика. В этой статье попытаемся дать общий обзор того, как этот инструмент сборки работает в целом и в частности в экосистеме Android.

Общие сведения

Gradle — это инструмент сборки, который базируется на концепциях более старых инструментов, таких как Apache Maven и Ant. Его использование DSL (предметно-ориентированного языка) устраняет необходимость в громоздких и длинных XML-файлах и позволяет разработчику только объявлять, что должно происходить во время сборки, используя особый и чистый синтаксис. Логику сборки следует определять только в плагинах, чтобы ограничить файл конфигурации сборки лишь объявлениями данных, хотя Gradle пока не считает это ошибкой.

Структура Gradle

Gradle работает в основном посредством задач и плагинов — комбинаций задач и их конфигураций. Входными данными задачи могут быть файлы или каталоги, а также любые другие данные Java-типа, но результатом служат только каталоги или файлы, записываемые на диск. Кроме того, если определяется задача, которая принимает результат другой задачи в качестве входных данных, мы создаем зависимость, и первая задача должна запускаться до начала выполнения другой.

Жизненный цикл Gradle

Сборка в Gradle выполняется в 3 этапа:

  1. Инициализация.
  2. Конфигурация.
  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. Некоторые из них никогда не следует изменять:

  1. ./gradle: файлы кэша для дистрибутива Gradle (управляются оберткой Gradle), файлы проекта и конфигурационные файлы.
  2. .idea: метаданные IDE.
  3. build.gradle.kts (в корне): объявления classpath-плагинов для всех подпроектов.
  4. gradle.properties: содержит свойства Gradle, а также временные свойства Android.
  5. gradlew.bat: загружает указанную версию Gradle и перенаправляет команды в загруженный дистрибутив Gradle (если доступно).
  6. local.properties: содержит свойства, связанные с вашим локальным компьютером.
  7. settings.gradle.kts: содержит глобальную информацию о сборке для инициализации и конфигурации Gradle.
  8. gradle/libs.version.toml: объявленные зависимости во всех подпроектах.
  9. gradle/wrapper/gradle-wrapper.jar: загружает указанный дистрибутив Gradle и запускает его.
  10. gradle/wrapper/gradle-wrapper.properties: указывает версию и место загрузки дистрибутива Gradle.
  11. subprojects: любой каталог с файлом build.gradle, включенный в settings.gradle.kts.
  12. subproject/build.gradle.kts: объявления плагинов + блоки конфигурации для подключенных плагинов + зависимости.
  13. src/* : файлы, связанные с проектом.
  14. app/proguard-rules.pro: определяет правила для управления операциями R8.

Основные компоненты сборки в Android:

  1. Исходный код: код, которым вы управляете.
  2. Зависимости библиотек: внешние библиотеки, используемые в проекте.
  3. Инструменты: компиляторы, плагины и SDK.

Ниже представлен упрощенный процесс того, что происходит при нажатии кнопки Run в Android Studio, с фокусом на Kotlin Android Plugin:

  1. Запускается gradlew.bat.
  2. Запускается gradle-wrapper.jar и читается gradle-wrapper.properties для проверки необходимости загрузки дистрибутива Gradle; либо производится запуск для вызова демона Gradle.
  3. Демон Gradle находит расположение JVM в .idea/gradle.xml и использует его при необходимости (передается в gradlew через Android Studio).
  4. Применяется Kotlin Android Plugin, читаются соответствующие блоки конфигурации (как показано ниже) и регистрируются связанные с ним задачи.
compileOptions { 
 sourceCompatibility = JavaVersion.VERSION_11 
 targetCompatibility = JavaVersion.VERSION_11 
}
  1. Gradle выполняет задачи и компилирует файлы проекта.
  2. Затем Android Gradle Plugin (AGP) получает выходные данные плагина и преобразует их в DEX-файлы в рамках другой зарегистрированной задачи, которую выполняет Gradle.

Заключение

Данная статья лишь поверхностно затрагивает инструмент сборки Gradle и то, как он интегрирован в Android Studio для сборки Android-проектов. Хотя он гораздо более многофункционален, в большинстве случаев Android-разработчикам для управления проектами достаточно знакомства с концепциями высокого уровня, подобными рассмотренным здесь. Удачи в работе!

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Salma Khodaei: Understanding Gradle in Android Projects

Предыдущая статьяКак искать работу программисту 
Следующая статьяКак создать платный доступ, который не вызовет раздражения у пользователей