Понимание основ build.gradle

Это не будет статья, содержащая расширенную информацию о Gradle и Groovy/Kotlin. Основная цель будет заключаться в том, чтобы предоставить основные «советы и рекомендации» для повседневных задач разработчика Android.

Что может быть хуже, чем пренебрежение файлом build.gradle? Имея два файла build.gradle, которыми можно пренебречь! Может ли все пойти еще хуже? Безусловно, вы можете добавить больше модулей в свое приложение, и вот вам больше файлов сборки, которыми можно пренебречь!

В чем разница между всеми этими файлами?

Существует файл Gradle верхнего уровня. В Android Studio вы увидите его как build.gradle (Project: project_name), а другие файлы сборки для модуля build.gradle (Module: project_name.module_name).
Файл сборки верхнего уровня предоставляет конфигурацию для самого Gradle до buildscript и для всех модулей проекта до allprojects.
Файл сборки для модуля предоставляет информацию о конфигурации и выполнении модуля, к которому он принадлежит.

Просмотреть все задачи Gradle в Android Studio

В Android Studio вы можете увидеть все задачи Gradle в этой части IDE.

Если вы не видите папку Tasks, я не могу дать вам больше информации о том, как заставить ее работать… но LeMimit определенно может показать вам путь.
Теперь, когда у вас есть Tasks, вы можете дважды щелкнуть, чтобы запустить любой из них.

Давайте код

В этом примере мы предполагаем, что у нас есть проект с двумя вариантами (simple, advanced).

Вставить библиотеки из общедоступного репо

Обычный способ вставить библиотеку — перейти в раздел dependencies файла сборки каждого модуля и написать implementation 'androidx.appcompat:appcompat:1.2.0'.

Зависимости на вкус

Мы можем добавить новую библиотечную зависимость для каждого варианта. Это можно сделать, написав simpleImplementation 'androidx.appcompat:appcompat:1.2.0', чтобы добавить зависимость для версии simple нашего приложения.

Вставка библиотек для локальной папки или репозитория

В некоторых уникальных обстоятельствах нам может потребоваться добавить зависимости из нашей локальной папки. Обычно мы добавляем библиотеку в папку libs модуля, который будем использовать.

Для нашего примера допустим, что у нас есть локальная библиотека balloon.aar.
Это библиотека skydoves/Balloon, которую я скачал для демонстрационных целей.

Если вы хотите добавить все библиотеки для всех вариантов в вашу папку libs, вы можете написать implementation fileTree(dir: 'libs', include:['*.aar']) в разделе dependencies файла сборки каждого модуля.

Помимо добавления библиотеки в виде файла, вы можете создать папку, которая будет вести себя как репозиторий. Мы должны написать flatDir { dirs “repo" } в файле сборки верхнего уровня, как показано ниже:

Теперь мы готовы добавить библиотеку, расположенную в папке repo, записав implementation (name:"balloon", ext:"aar") в раздел dependencies файла сборки каждого модуля.

Фазы Gradle

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

doFirst и doLast перейдут в фазу Выполнение, но все, что находится за пределами этих двух блоков, будет выполнено во время Настройки.
Допустим, вы хотите запустить задачу с именем anotherTask. вы увидите строку A1 -> Configuration phase из a1SampleTask, напечатанную в выводе Run Console. Конфигурация задач происходит постоянно, независимо от того, какую задачу вы выбрали для выполнения.

Объединение задач

Допустим, у вас есть 2 задачи ( a1SampleTask, a2SampleTask), которые вы хотите выполнить с некоторой связью между ними.
Если вы хотите выполнить a2SampleTask, но a1SampleTask всегда должна выполняться раньше, вы можете связать их, привязав по одной к каждой другое (a2SampleTask.dependsOn(a1SampleTask)).
Гораздо более легкая связь — a2SampleTask.mustRunAfter(a1SampleTask). Когда вы выполняете только a2SampleTask, он не запускает a1SampleTask. Но если вы хотите выполнить a2SampleTask и a1SampleTask вместе, он всегда выполняет a1SampleTask перед a2SampleTask.

Динамические задачи

Некоторые задачи зависят от задач, которых не существует с самого начала. Некоторые задачи и свойства создаются позже, например, варианты приложений.
Вы не можете создать задачу так, как мы видели раньше, и работать с таким вариантом, как simpleDebugSampleTask. Если вы хотите запустить приложение после его установки (что заставляет вас зависеть от вариантов приложения), вы должны создать динамическую задачу, подобную этой:

В этом примере вы должны проверить variant и его задачу install, которая также является динамической, прежде чем создавать свою собственную задачу.

Реализация плагина

У нас есть 2 способа написать плагин для Gradle (бинарный плагин и плагин скрипта). Для этого примера мы собираемся создать динамическую задачу для изменения имени экспортированного apk-файла.
Создайте новый файл outputFilesHandling.gradle в вашем модуле app и создайте в нем динамическую задачу (для переименования экспортированного apk-файла).

Затем вы можете перейти к своему модулю app и применить эту задачу (apply from: outputFilesHandling.gradle"). Убедитесь, что вы используете apply from вместо apply plugin.

Плагина сценария достаточно для большинства наших задач. Если вы хотите пойти дальше, реализовав и опубликовав свой плагин, вам нужно использовать бинарный плагин. В этом поможет Шахрукх!

Проект этого руководства

Если вы хотите увидеть все вышеперечисленное и некоторые другие свойства Gradle для Android, посетите мой пример проекта.