Cómo aplicar la lógica de compilación personalizada

En esta sección, se describen temas avanzados que son útiles cuando quieres extender el complemento de Gradle para Android o escribir tu propio complemento.

Cómo publicar dependencias de variantes en la lógica personalizada

Una biblioteca puede tener funcionalidades que otros proyectos o subproyectos probablemente quieran usar. La publicación de una biblioteca es el proceso mediante el cual esta se habilita para sus consumidores. Las bibliotecas pueden controlar a qué dependencias pueden acceder sus consumidores en el tiempo de ejecución y compilación.

Existen dos configuraciones independientes que contienen las dependencias de cada ruta de clase que deben usar los consumidores para usar la biblioteca, como se describe a continuación:

  • variant_nameApiElements: Esta configuración contiene las dependencias transitivas que están disponibles para los consumidores durante el tiempo de compilación.
  • variant_nameRuntimeElements: Esta configuración contiene las dependencias transitivas que están disponibles para los consumidores durante el tiempo de ejecución.

Para obtener más información sobre la relación entre las diferentes opciones de configuración, ve a Opciones de configuración del complemento de biblioteca Java.

Cómo personalizar las estrategias de selección de dependencias

Un proyecto puede incluir una dependencia en dos versiones diferentes de la misma biblioteca, lo que puede generar conflictos entre las dependencias. Por ejemplo, si tu proyecto depende de la versión 1 del módulo A y la versión 2 del módulo B, y el módulo A depende de forma transitiva de la versión 3 del módulo B, se producirá un conflicto con las versiones de las dependencias.

Para resolver este conflicto, el complemento de Android para Gradle usa la siguiente estrategia de selección de dependencias: cuando el complemento detecta que hay diferentes versiones del mismo módulo en el gráfico de dependencias, selecciona de manera predeterminada la que tenga el número de versión más alto.

Sin embargo, es posible que esta estrategia no siempre funcione como lo deseas. Si quieres personalizar la estrategia de selección de dependencias, usa las siguientes opciones de configuración a fin de determinar las dependencias específicas de una variante que se necesitan para tu tarea:

  • variant_nameCompileClasspath: Esta configuración contiene la estrategia de resolución para una ruta de clase de compilación de variantes específica.
  • variant_nameRuntimeClasspath: Esta configuración contiene la estrategia de resolución para una ruta de clase de tiempo de ejecución de variantes específica.

El complemento de Gradle para Android incluye captadores que puedes usar para acceder a los objetos de configuración de cada variante. Por lo tanto, puedes usar la API de variantes para consultar la resolución de la dependencia como se muestra en el siguiente ejemplo:

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