Разработчики облегчают жизнь людям, а Gradle — разработчикам. Если вы пишете на Android, эта статья для вас. Читайте о том, что за зверь этот Gradle (спойлер: он слон), а также — как с ним работать.


Gradle — система автоматической сборки, которую используют для упрощения работы с Java. С помощью (условно) стандартизированных средств она помогает разработчикам собрать нужный продукт без потери его уникальности. Ведь процесс работы с Gradle — не просто выбор шаблона. Но обо всём по порядку.


image


Где скачать Gradle


Скачать Gradle можно на официальном сайте. Рекомендуем качать и устанавливать всё вручную (чтобы жизнь малиной не казалась). Инструкция, а также все необходимые ссылки даны в разделе Installing Gradle > Installing Manually. Кстати, рекомендуем прочитать всё. Вообще всё. Серьёзно.


На этой странице нужно выбрать версию системы и кликнуть по "binary-only". Затем — распаковать zip-архив и настроить переменную среды окружения PATH так, как сказано в инструкции. Если всё сделано правильно, после установки команда gradle -v должна отображать версию выбранной системы.


Иногда выходит так, что во время определения система находит Gradle в неожиданном месте. На Windows это решается следующим образом:
for %i in (gradle.bat) do echo. %~$PATH:i


Как работать с Gradle


Gradle не привязан к конкретной платформе. К тому же, в системе используют разные языки программирования. Наиболее популярные — Groovy DSL и Kotlin (но можно писать и на других). В статье будет использован первый вариант, так как это стандартный язык описания задач в Gradle.


Прежде чем начинать работу, обратите внимание на термины: «задача» и «плагин», ещё раз. Ведь именно на них строится вся работа с системой. Плагины предоставляют и создают задачи. Задачи — те действия, которые надо сделать. Всё очень просто.


Подробнее об этом вы можете прочитать в инструкции к плагинам: JavaCompile (добавить новые задачи), SourceSet (добавить новые объекты домена). Также плагины работают с соглашениями и расширяют объекты. Например, с помощью плагина можно добавить новые элементы DSL и (или) настроить их.


Набор "Core Plugins" автоматически создаётся при установке Gradle. На первых этапах рекомендуют использовать категорию "Utility", а именно — плагин "Build Init Plugin". Он предоставляет задачи для инициализации проекта в системе. Выбрать тип проекта можно из списка на сайте.


Пусть это будет java-application.
Задача: gradle init --type java-application


После этого в папке появятся новые файлы. В их числе:


  • папка gradle (внимание, не .gradle) и файл gradlew.bat — это враппер, обёртка;
  • файл build.gradle — скрипт, где указаны библиотеки, фреймворки, плагины и задачи конкретного проекта.

В последнем файле будет отображена секция плагина. Этот плагин уже имеет прикреплённые к нему задачи. Их список можно посмотреть с помощью команды gradle tasks.


Задачи


Показаны блоками, по своим функциям. К каждой даётся краткое описание. Для понимания требуется знание английского на базовом уровне. Если вы не входите в эту группу — подойдёт любой переводчик. Сложных языковых конструкций в build.gradle нет.


После выбора задачи и её успешного завершения вы увидите внизу зелёную надпись "BUILD SUCCESSFUL". Это значит, что (вам повезло) всё прошло без проблем. Также внизу система выдаст краткий отчёт.


Если статус "executed" — задача действительно выполнена. Если "up-to-date" — нет. Это не значит, что произошёл какой-то сбой. В случае такого статуса задача не требует решения в принципе, т. е. её объект уже в актуальном состоянии.


Это произошло потому, что в Gradle автоматически формируется "Up-to-date checks" — инкрементальный билд, цель которого — оптимизация работы системы. Поэтому задачи, которые уже завершены или не требуют действий, не прорабатываются.


Отключить этот build можно. Вручную. Для этого необходимо выполнить задачу с указанием флага --rerun-tasks. Если всё сделано правильно, статус у всех задач изменится на "executed".


Также Gradle позволяет просматривать логи разного уровня. Например, команда gradle run -i позволит читать информационные сообщения о работе системы, команда run -q — включить режим тишины, run -d — показывать все сообщения журнала и т. д. Полный список логов и дополнительная информация о системе логирования тут.


Зависимости


Управление зависимостями — указание библиотек или фреймворков, которые нужны проекту. Gradle должна включить эти зависимости в определённый момент, чтобы в конце собрать приложение корректно (или вообще). Команда gradle init для java-application в build-скрипте автоматически вызывает информацию о 2 конфигурациях.


Implementation отвечает за транзитивность: её зависимости будут невидимыми для пользователей. TestImplementation расширяет предыдущую конфигурацию. Таким образом, они работают в связке.


Чтобы лучше понять зависимости и принцип работы с ними, прочтите главу "Managing Dependency Configurations" в официальной инструкции. Кстати, в "API and implementation separation" подробно объясняется про API и implementation, а также разницу между ними.


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


Далее нужно включить в jar зависимости. Это необходимо для компиляции.
Слишком сложно? Используйте "Gradle Shadow Plugin".


Команда gradle --console plain dependencies вызывает список всех конфигураций и привязанных к ним зависимостей в виде перечня. Также система предлагает разработчикам фильтр, который исключает из перечня зависимости (gradle --console plain dependencies | find " — ") — некоторым так удобнее.


Наиболее частые виды зависимостей:


  • внешние — загружаются из внешних хранилищ;
  • проектные — зависят от модуля в конкретном проекте;
  • файловые — подключаются как jar- или aar-архивы.

Что из этого списка использовать, решает разработчик.
Для Java всё хорошо расписано в "Dependency management".


Лайфхаки


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


  1. Используйте консоль. Найти команды иногда бывает проблематично, а при изменении build.gradle система может заглючить или, вообще, перезагрузить проект. Поэтому специалисты рекомендуют вызывать Gradle прямо из консоли.

    Враппер обычно идёт вместе с проектом. На Linux и macOS можно обращаться напрямую. На Windows — вызывать вместо враппера bat-файл.


  2. Gradle хранит кэш 1 сутки. Это можно перенастроить. Необходимо отредактировать код:


    // build.gradle
    configurations.all {
    resolutionStrategy.cacheChangingModulesFor КОЛ-ВО ЧАСОВ ЦИФРОЙ, 'hours'
    resolutionStrategy.cacheDynamicVersionsFor КОЛ-ВО МИНУТ ЦИФРОЙ, 'minutes'
    }

  3. – –refresh-dependencies — полезная команда, которая запустит обновление всех зависимостей в Gradle. Может пригодиться, если какие-то данные в кэше повредились, так как верифицирует. Удобно использовать при повреждении данных кэша, так как происходит их верификация и обновление (если отличаются).


  4. Используйте CI (непрерывную интеграцию) в работе с системой автоматической сборки. Пусть модульные тесты выполняются для всех коммитов. Также специалисты рекомендуют подключать и unit-тесты. Это можно сделать в Android Studio.

    Такая комбинация позволит обнаружить ошибки раньше. И хотя она замедлит процесс запуска, разработчик сможет отдохнуть в дальнейшем. Так что лайфхак на перспективу.


  5. Try again. Страшно? (Нам тоже) На самом деле синхронизацию не всегда нужно сразу запускать заново. Сначала специалисты рекомендуют проверить систему в целом. Например, с помощью любой простой команды — это поможет понять, каковы шансы на успех следующей синхронизации.


  6. Настройте с Gradle среду разработки IntelliJ IDEA. Это позволит оптимизировать процесс работы, а также воспользоваться волшебным списком.


  7. Совет для тех, кто работает с Gradle из командной строки Android Studio. Проверьтесь на ошибку "Starting a Gradle Daemon, 1 incompatible could not be reused" (#68374709). Это бич системы, который разработчики пока не исправили.



Одна из основных проблем Gradle — "Gradle build failed". Обойдёмся без лишних слов, если вам это уже знакомо. Если же нет — удачи.


image


Впрочем, главная проблема Gradle другая. Время, которое требуется системе на сборку, уже давно стало (очень печальной) легендой в кругах специалистов. Ускорить работу нельзя, по крайней мере — значительно.


Так что придётся ждать в любом случае.


Можете, например, слетать куда-нибудь в космос, как в «Интерстеллар».


image


Вывод


Gradle — это хорошее решение, несмотря на все минусы. Автоматическая сборка позволит вам сэкономить силы и время (как иронично это бы ни звучало после предыдущего абзаца). А также — сделать своё приложение чище. Система заметит любую ошибку и не позволит закончить работу, пока та не будет исправлена (любой ценой).


Комментарии (2)


  1. VIkrom
    29.10.2019 15:46

    ––refresh-dependencies — полезная команда, которая запустит обновление всех зависимостей в Gradle.

    Запустить — запустит, а вот что обновит — не факт. Периодически приходится вручную грохать модули в кэше, потому что ––refresh-dependencies не отрабатывает.


  1. fRoStBiT
    30.10.2019 12:25

    Враппер обычно идёт вместе с проектом. На Linux и macOS можно обращаться напрямую. На Windows — вызывать вместо враппера bat-файл.

    А чем по-вашему принципиально отличается sh-скрипт gradlew для Unix-подобных ОС и gradlew.bat для Windows?


    А долгая сборка обычно вызвана не Gradle, а тем большим объёмом работы, которая делается при сборке типичного Android приложения. При сборке руками в лучшем случае будет то же самое. Сам Gradle уже давно не тормозит.
    Если не свызываться с Android, всё работает быстро и стабильно.