Appliquer une logique de compilation personnalisée

Cette section décrit des sujets avancés qui peuvent vous être utiles lorsque vous souhaitez étendre le plug-in Android Gradle ou écrire votre propre plug-in.

Publier des dépendances de variantes dans une logique personnalisée

Une bibliothèque peut comporter des fonctionnalités que d'autres projets ou sous-projets pourraient utiliser. La publication d'une bibliothèque est le processus par lequel elle est mise à la disposition de ses consommateurs. Les bibliothèques peuvent contrôler les dépendances auxquelles leurs utilisateurs ont accès au moment de la compilation et de l'exécution.

Deux configurations distinctes contiennent les dépendances transitives de chaque classpath que les consommateurs doivent utiliser pour exploiter la bibliothèque, comme décrit ci-dessous :

  • variant_nameApiElements : cette configuration contient les dépendances transitives disponibles pour les consommateurs lors de la compilation.
  • variant_nameRuntimeElements : cette configuration contient les dépendances transitives disponibles pour les consommateurs lors de l'exécution.

Pour en savoir plus sur les relations entre les différentes configurations, consultez la section Configurations du plug-in Java Library.

Stratégies personnalisées pour la résolution des dépendances

Un projet peut inclure une dépendance sur deux versions différentes de la même bibliothèque, ce qui peut entraîner des conflits de dépendances. Par exemple, si votre projet dépend de la version 1 du module A et de la version 2 du module B, et que le module A dépend de manière transitoire de la version 3 du module B, il existe un conflit de version de dépendance.

Pour résoudre ce conflit, le plug-in Android Gradle utilise la stratégie de résolution des dépendances suivante : lorsque différentes versions du même module figurent dans le graphique de dépendance, la version dont le numéro est le plus élevé est choisie par défaut.

Cependant, cette stratégie peut ne pas produire les résultats escomptés. Pour personnaliser la stratégie de résolution des dépendances, utilisez les configurations suivantes afin de résoudre les dépendances spécifiques à une variante et nécessaires à votre tâche :

  • variant_nameCompileClasspath : cette configuration contient la stratégie de résolution pour le classpath de compilation d'une variante donnée.
  • variant_nameRuntimeClasspath : cette configuration contient la stratégie de résolution pour le classpath d'exécution d'une variante donnée.

Le plug-in Android Gradle inclut des getters que vous pouvez utiliser pour accéder aux objets de configuration de chaque variante. Ainsi, vous pouvez utiliser l'API des variantes pour interroger la résolution des dépendances, comme indiqué dans l'exemple ci-dessous:

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