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

Реализация (устаревшая версия "compile")

Gradle добавляет зависимость к пути к классам компиляции и упаковывает зависимость в выходные данные сборки. Однако, когда ваш модуль настраивает зависимость реализации, он сообщает Gradle, что вы не хотите, чтобы модуль передавал зависимость другим модулям во время компиляции. То есть зависимость доступна другим модулям только во время выполнения. Использование этой конфигурации зависимости вместо api или компиляции может привести к значительным улучшениям сборки, поскольку она уменьшает количество модулей, которые системе сборки необходимо перекомпилировать. Например, зависимость реализации меняет ее API, Gradle перекомпилирует только эту зависимость и модули, которые напрямую зависят от нее. Эту конфигурацию следует использовать для большинства приложений и тестовых модулей.

api (устаревшая версия - компилировать)

Gradle добавляет зависимость к пути к классам компиляции и выходным данным сборки. Когда модуль включает в себя зависимость api, он сообщает gradle, что модуль хочет транзитивно экспортировать эту зависимость в другие модули, чтобы она была доступна им как во время выполнения, так и во время компиляции.

Эта конфигурация ведет себя так же, как компиляция (которая теперь устарела), но вы должны использовать ее с осторожностью и только с зависимостями, которые необходимо транзитивно экспортировать другим вышестоящим потребителям. Это потому, что зависимость api изменяет свой внешний API, Gradle перекомпилирует все модули, которые имеют доступ к этой зависимости во время компиляции. Таким образом, наличие большого количества зависимостей api может значительно увеличить время сборки. Если вы не хотите предоставлять API зависимости отдельному модулю, библиотечные модули должны вместо этого использовать зависимости реализации.

CompileOnly (устаревшая версия - предоставляется)

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

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

annotationProcessor (устаревшая версия - компиляция)

Чтобы добавить зависимость от библиотеки, которая является обработчиком аннотаций, вы должны добавить ее в путь к классам обработчика аннотаций, используя конфигурацию annotationProcessor. Это связано с тем, что использование этой конфигурации улучшает производительность сборки, отделяя путь к классам компиляции от пути к классам процессора аннотаций. Если Gradle находит обработчики аннотаций в пути к классам компиляции, он деактивирует предотвращение компиляции, что отрицательно влияет на время сборки. (Gradle 5.0 и выше игнорируют обработчики аннотаций, найденные в пути к классам компиляции).

Подключаемый модуль Android Gradle предполагает, что зависимость является обработчиком аннотаций, если его JAR-файл содержит следующий файл:

META-INF / services / javax.annotation.processing.Processor.

Если плагин обнаруживает обработчик аннотаций, которого нет в пути к классам компиляции, он выдает ошибку сборки.