Aplicar lógica de build personalizada

Esta seção descreve os tópicos avançados que são úteis para estender o plug-in do Android para Gradle ou para escrever seu próprio plug-in.

Publicar dependências variantes na lógica personalizada

Uma biblioteca pode ter funcionalidades que outros projetos ou subprojetos talvez queiram usar. Publicar uma biblioteca é o processo de disponibilização da biblioteca aos clientes. As bibliotecas podem controlar a quais dependências os clientes terão acesso no momento da compilação e execução.

Existem duas configurações diferentes que possuem as dependências transitivas de cada caminho de classe. Elas podem ser usadas pelos clientes para consumir a biblioteca, conforme descrito abaixo.

  • variant_nameApiElements: essa configuração possui as dependências transitivas que estão disponíveis aos clientes no tempo de compilação.
  • variant_nameRuntimeElements: esta configuração possui as dependências transitivas que estão disponíveis aos clientes durante a execução.

Para saber mais sobre as relações entre as diferentes configurações, acesse Configurações de plug-in da Biblioteca Java (link em inglês).

Estratégias de resolução de dependências personalizadas

Um projeto pode incluir uma dependência em duas versões diferentes da mesma biblioteca, o que pode resultar em conflitos de dependência. Por exemplo, se o projeto depende da versão 1 do módulo A e da versão 2 do módulo B, e o módulo A depende transitivamente da versão 3 do módulo B, ocorre um conflito de versão de dependência.

Para resolver esse conflito, o Plug-in do Android para Gradle usa a seguinte estratégia de resolução de dependência: quando o plug-in detecta que diferentes versões do mesmo módulo estão no gráfico de dependência, por padrão, ele escolhe aquele com o número de versão mais alto.

No entanto, talvez essa estratégia não funcione sempre como o esperado. Para personalizar a estratégia de resolução de dependência, use as configurações abaixo para resolver dependências específicas de uma variante que são necessárias para sua tarefa:

  • variant_nameCompileClasspath: esta configuração contém a estratégia de resolução do caminho de classe da compilação de uma determinada variante.
  • variant_nameRuntimeClasspath: essa configuração contém a estratégia de resolução do caminho de classe de execução de uma determinada variante.

O plug-in do Android para Gradle inclui getters que podem ser usados para acessar os objetos de configuração de cada variante. Assim, é possível usar a API da variante para consultar a resolução da dependência, conforme mostrado no exemplo abaixo.

Kotlin

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 {
            ...
        }
    }
}

Groovy

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 {
            ...
        }
    }
}