Применить пользовательскую логику сборки

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

Публикация зависимостей вариантов в пользовательской логике

Библиотека может иметь функциональные возможности, которые могут захотеть использовать другие проекты или подпроекты. Публикация библиотеки — это процесс, посредством которого библиотека становится доступной ее потребителям. Библиотеки могут контролировать, к каким зависимостям имеют доступ ее потребители во время компиляции и во время выполнения.

Существует две отдельные конфигурации, которые содержат транзитивные зависимости каждого пути к классам, которые должны использоваться потребителями для использования библиотеки, как описано ниже:

  • variant_name ApiElements : эта конфигурация содержит транзитивные зависимости, доступные потребителям во время компиляции.
  • variant_name RuntimeElements : эта конфигурация содержит транзитивные зависимости, доступные потребителям во время выполнения.

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

Пользовательские стратегии разрешения зависимостей

Проект может включать зависимость от двух разных версий одной и той же библиотеки, что может привести к конфликтам зависимостей. Например, если ваш проект зависит от версии 1 модуля A и версии 2 модуля B, а модуль A транзитивно зависит от версии 3 модуля B, возникает конфликт версий зависимостей.

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

Однако эта стратегия может не всегда работать так, как вы хотите. Чтобы настроить стратегию разрешения зависимостей, используйте следующие конфигурации для разрешения конкретных зависимостей варианта, необходимого для вашей задачи:

  • variant_name CompileClasspath : эта конфигурация содержит стратегию разрешения для пути к классам компиляции данного варианта.
  • variant_name RuntimeClasspath : эта конфигурация содержит стратегию разрешения для пути к классам среды выполнения данного варианта.

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

Котлин

android {
    applicationVariants.all {
        // Return compile configuration objects of a variant.
        compileConfiguration.resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        runtimeConfiguration.resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        annotationProcessorConfiguration.resolutionStrategy {
            ...
        }
    }
}

классный

android {
    applicationVariants.all { variant ->
        // Return compile configuration objects of a variant.
        variant.getCompileConfiguration().resolutionStrategy {
        // Use Gradle's ResolutionStrategy API
        // to customize how this variant resolves dependencies.
            ...
        }
        // Return runtime configuration objects of a variant.
        variant.getRuntimeConfiguration().resolutionStrategy {
            ...
        }
        // Return annotation processor configuration of a variant.
        variant.getAnnotationProcessorConfiguration().resolutionStrategy {
            ...
        }
    }
}