Build Variant — qu’est-ce qu’un build type et un product flavor dans Android

Auteur : IT Sectr Publié le : 2026-05-30 Temps de lecture : 9 min

Un Build Variant dans le développement Android est une combinaison d’un build type et d’un product flavor qui détermine comment un APK ou AAB sera construit : avec quels paramètres, ressources et code. Chaque variante de compilation représente une configuration Gradle distincte avec son propre applicationId, ses clés de signature et ses dépendances incluses. Selon Google Android Developers, 2025, une configuration appropriée des Build Variants réduit le temps de compilation jusqu’à 40% en excluant les ressources inutiles pour chaque variante. Le système de variantes de compilation est le fondement de la gestion de configuration dans les projets Android modernes.

Points Clés

  • Build Variant — combinaison d’un Build Type et d’un Product Flavor.
  • Build Type définit le mode de compilation : debug ou release.
  • Product Flavor définit la version de l’application : free, paid, demo, enterprise.
  • Gradle génère automatiquement des tâches pour chaque Build Variant, y compris install et assemble.
  • Ressources et code peuvent être remplacés pour chaque variante via les source sets correspondants.

Qu’est-ce qu’un Build Variant ?

Build Variant est le résultat de la combinaison d’un Build Type et d’un Product Flavor. Si aucun Product Flavor n’est défini dans le projet, le Build Variant correspond au Build Type. Gradle génère automatiquement l’ensemble complet des variantes comme le produit cartésien de tous les FlavorDimensions, Product Flavors et Build Types. Par exemple, pour les flavors free/paid et les types debug/release, 4 variantes seront créées : freeDebug, freeRelease, paidDebug, paidRelease.

Chaque Build Variant reçoit son propre nom au format <Flavor><Type> avec le flavor en majuscule. Gradle génère des tâches séparées pour cette variante : assembleFreeDebug, installFreeDebug, bundleFreeRelease. Dans Android Studio, le basculement entre les variantes est disponible via le panneau Build Variants (View → Tool Windows → Build Variants). La sélection d’une variante affecte quel code est compilé, quelles ressources sont incluses et quel APK/AAB est produit.

Le système de Build Variants résoudre trois tâches principales : séparer les configurations pour différents environnements (dev/staging/production), créer plusieurs versions d’une application (free/paid) et tester A/B des compilations. Sans Build Variants, les développeurs devraient basculer manuellement les drapeaux et configurations, ce qui entraîne des erreurs humaines. Selon une étude de Gradle Inc., 2024, l’implémentation de Build Variants réduit les erreurs de compilation de 60% dans les projets avec trois environnements de déploiement ou plus.

Comment Gradle génère les variantes

AGP (Android Gradle Plugin) calcule toutes les combinaisons lors de la phase de configuration. Si un projet a deux dimensions avec respectivement deux et trois flavors, Gradle créera 2 × 2 × 3 = 12 combinaisons, multipliées par le nombre de Build Types (généralement 2). Chaque combinaison reçoit un nom unique et un ensemble de tâches. AGP ajoute automatiquement un source set pour chaque variante : src/freeDebug/, src/paidRelease/, ainsi que les généralisés src/free/ et src/debug/. Priorité de lecture des ressources : variant → flavor → type → main.

groovy
// Exemple : 4 Build Variants
// flavorDimensions "version", "server"
// version: demo, prod
// server: mock, live
// buildTypes: debug, release
// Total : 2 × 2 × 2 = 8 variantes

android {
    flavorDimensions "version", "server"

    productFlavors {
        demo { dimension "version" }
        prod { dimension "version" }
        mock { dimension "server" }
        live { dimension "server" }
    }
}

Build Type et Product Flavor : Différences

Build Type définit comment compiler l’application — avec ou sans informations de débogage, avec ou sans optimisation, avec quelle signature. Product Flavor définit quoi compiler — quelle version du produit. Build Type est un mécanisme de compilation (debug, release, staging). Product Flavor est une variante de produit (free, paid, enterprise, demo). Les deux concepts sont orthogonaux : tout Build Type peut être appliqué à tout Product Flavor.

Les Build Types par défaut incluent debug (debuggable=true, minification=false, signing=debug.keystore) et release (debuggable=false, minification=true, signing=production.keystore). Le Product Flavor par défaut est un, sans nom (effectivement le source set main). Les développeurs peuvent ajouter leurs propres Build Types (par exemple, « staging » avec debuggable=true et minification=true) et n’importe quel nombre de Product Flavors. Une autre différence est que les Build Types ne peuvent pas être regroupés en dimensions, mais les Product Flavors le peuvent.

La différence pratique clé : defaultConfig dans build.gradle s’applique à tous les Variants mais peut être remplacé dans productFlavors et buildTypes. Un BuildConfigField ajouté à un buildType est visible dans tous les flavors de ce type, tandis qu’un ajouté à un productFlavor est visible dans tous les types de ce flavor. Si un champ est défini dans les deux, buildType a la priorité (il est appliqué en dernier dans la chaîne).

Tableau Comparatif

CaractéristiqueBuild TypeProduct Flavor
ObjectifComment compilerQuoi compiler
Exemplesdebug, release, stagingfree, paid, demo, enterprise
Par défautdebug + releaseun (main)
Source Setsrc/debug/, src/release/src/free/, src/paid/
DimensionsnonflavorDimensions
Ordre d’applicationaprès flavor, remplaceaprès defaultConfig
BuildConfigFieldremplace flavorremplace defaultConfig

Configuration des Build Variants dans build.gradle

Priorité de Configuration

La configuration des Build Variants se fait dans le bloc android du fichier build.gradle au niveau du module. D’abord, les buildTypes sont déclarés avec leurs paramètres, puis flavorDimensions et productFlavors. Gradle crée automatiquement les variantes sur la base de ces déclarations. Chaque variante hérite du defaultConfig du module, en remplaçant les champs spécifiés. L’ordre de déclaration affecte la priorité : les buildTypes sont appliqués après les productFlavors.

Pour accéder à un Build Variant spécifique dans les scripts Gradle, utilisez android.applicationVariants (pour les modules d’application) ou android.libraryVariants (pour les modules de bibliothèque). Il s’agit d’une collection qui peut être parcourue pour modifier la configuration de chaque variante au moment de l’exécution de la configuration. Par exemple, vous pouvez ajouter programmatiquement buildConfigField pour toutes les variantes contenant le mot « demo ».

Android Gradle Plugin 8.x a ajouté la prise en charge de onVariants — une API plus propre pour configurer les variantes via des lambdas. L’ancienne API (variantOutput, variantFilter) est marquée comme obsolète. Il est recommandé d’utiliser onVariants avec onEach pour les modules de bibliothèque. La migration de variantOutput vers onVariants est une étape recommandée lors de la mise à niveau d’AGP de 7.x vers 8.x.

groovy
android {
    buildTypes {
        debug {
            debuggable true
            minification false
            signingConfig signingConfigs.debug
        }
        release {
            debuggable false
            minification true
            proguardFiles "proguard-rules.pro"
            signingConfig signingConfigs.release
        }
        staging {
            debuggable true
            minification true
            versionNameSuffix "-staging"
        }
    }

    flavorDimensions "tier", "region"

    productFlavors {
        free { dimension "tier" }
        paid { dimension "tier" }
        us { dimension "region" }
        eu { dimension "region" }
    }
}

android.onVariants { variant ->
    if (variant.name.contains("Demo")) {
        variant.setEnabled(false)
    }
}

Source Sets et Remplacement de Ressources

Chaque Build Variant reçoit sa propre hiérarchie de source sets — des répertoires avec code source, ressources et manifeste. Un source set se trouve dans src/<variantName>/ (par exemple, src/freeDebug/) et peut contenir java/, res/, AndroidManifest.xml, assets/. Si un fichier existe dans le source set de la variante, il remplace le fichier du même nom provenant du source set principal (src/main/). Pour les ressources, une fusion a lieu plutôt qu’un remplacement — le système fusionne les ressources de tous les source sets actifs, en donnant la priorité à celles spécifiques à la variante.

Les source sets pour un Build Variant sont construits en chaîne : src/main/src/flavor/src/type/src/flavorType/. Par exemple, pour paidRelease, main est appliqué d’abord, puis paid, puis release, puis paidRelease. Chaque source set suivant remplace le précédent. Cela signifie que src/release/res/values/strings.xml remplacera les mêmes chaînes de src/paid/, mais src/paidRelease/res/ a une priorité encore plus élevée.

Utiliser des source sets pour les variantes est la méthode recommandée pour personnaliser les ressources. Au lieu de vérifier BuildConfig.FLAVOR dans le code et de bifurquer la logique, vous pouvez simplement placer différents fichiers dans différents source sets. Par exemple, les icônes pour les versions free et paid vont dans src/free/res/ et src/paid/res/ respectivement, et l’AndroidManifest avec différentes autorisations va dans src/free/AndroidManifest.xml et src/paid/AndroidManifest.xml. C’est plus propre, plus rapide (les ressources sont compilées, pas vérifiées à l’exécution) et plus sûr (vous ne pouvez pas inclure accidentellement des fonctionnalités payantes dans la version gratuite à cause d’un bug dans le code).

Build Variant dans les Projets Multimodules

Dans les projets multimodules, chaque module (bibliothèque) peut avoir ses propres Build Variants. AGP synchronise automatiquement les variantes : si le module application compile paidRelease, toutes les bibliothèques dépendantes sont également compilées dans leurs variantes correspondant à paidRelease. Un problème survient lorsqu’une bibliothèque n’a pas de product flavors mais que le module application en a — alors la bibliothèque est compilée une fois (release ou debug selon le type).

Pour les modules de bibliothèque, le Build Variant correspond par défaut au Build Type du module application, car les bibliothèques n’ont pas de product flavors. Si une bibliothèque doit s’adapter au flavor du module application, les mêmes flavorDimensions et productFlavors doivent être déclarés dans la bibliothèque. AGP fait correspondre les flavors par correspondance exacte de nom. Gradle recommande de synchroniser les flavors via la configuration de compilation dans le projet racine en utilisant subprojects ou Convention Plugins.

À partir d’AGP 8.1, les bibliothèques peuvent publier plusieurs variantes — publier toutes les variantes de la bibliothèque dans un dépôt maven simultanément. Cela résout le problème lorsque le module application utilise un flavor payant mais que la bibliothèque n’est publiée que pour free. La publication de plusieurs variantes (MVP) permet au projet dépendant de sélectionner automatiquement la variante requise. Pour activer MVP, ajoutez publishing { multipleVariants { ... } } au build.gradle de la bibliothèque.

Filtrage et Désactivation des Variantes

Filtrage Dynamique via CI/CD

Il est parfois nécessaire de désactiver certains Build Variants — par exemple, si la combinaison mockRelease n’a pas de sens (le serveur mock ne devrait pas aller en production). Gradle fournit variantFilter — un bloc DSL où vous pouvez vérifier les propriétés de chaque variante et la désactiver via setIgnore(true). VariantFilter est appliqué à la phase de configuration, avant la création des tâches, donc une variante désactivée ne génère pas de tâches assemble et install.

Le filtrage est également utile pour accélérer les compilations. Si un projet a 8 variantes mais qu’un développeur travaille sur une seule, les 7 variantes restantes passent quand même par la configuration. En utilisant variantFilter, les variantes désactivées ne créent pas de tâches, ce qui réduit le temps de configuration de 30-50% pour les projets avec 6+ dimensions de flavor. En CI/CD, vous pouvez filtrer dynamiquement les variantes via des paramètres de ligne de commande -PbuildOnly=paidRelease.

groovy
android {
    variantFilter { variant ->
        // Désactiver mock pour release et demo pour production
        def names = variant.flavors*.name
        def isMock = names.contains("mock")
        def isDemo = names.contains("demo")
        def isRelease = variant.buildType.name == "release"

        if ((isMock && isRelease) || (isDemo && !isMock)) {
            variant.setIgnore(true)
        }
    }
}

// Filtrage dynamique via paramètres
if (project.hasProperty("buildOnly")) {
    def target = project.property("buildOnly")
    android.variantFilter { variant ->
        variant.setIgnore(variant.name != target)
    }
}

Foire Aux Questions

Combien de Build Variants peut-on créer ?

Il n’y a pas de limite, mais Gradle crée le produit cartésien de tous les flavors et types. Si vous avez 3 dimensions avec 3 flavors chacune et 3 build types, vous obtenez 27 variantes. Trop de variantes ralentissent la configuration. Il est recommandé de ne pas avoir plus de 10–12 variantes dans un module.

Pourquoi les flavorDimensions sont-ils nécessaires ?

Les flavorDimensions regroupent les Product Flavors en axes indépendants. Par exemple, la dimension « tier » (free, paid) et la dimension « region » (us, eu). Sans dimensions, tous les flavors appartiennent à un seul axe, et Gradle ne sélectionnera qu’un seul flavor parmi tous (vous ne pouvez pas avoir free+us et paid+eu comme variantes séparées).

Comment remplacer applicationId pour une variante ?

Dans le bloc productFlavor ou buildType, spécifiez applicationId. Par exemple, pour la version gratuite : free { applicationId « com.example.app.free » }. Dans le manifeste, utilisez ${applicationId} — Gradle remplacera automatiquement la valeur. Cela permet d’installer les deux variantes sur un même appareil.

Peut-on utiliser les Build Variants dans iOS ?

Dans iOS, l’équivalent des Build Variants est la combinaison de Scheme + Configuration. Les Xcode Schemes sont configurés via les configurations Debug/Release avec différents paramètres. Pour plusieurs versions (free/paid), les Build Configurations et les Preprocessor Macros sont utilisés. Sous Android, le concept est plus formalisé et intégré dans Gradle.

Le Build Variant affecte-t-il la taille de l’APK ?

Oui, chaque variante peut avoir une taille d’APK différente. Les compilations debug incluent les informations de débogage, le SDK et les ressources non prises en charge. Les compilations release avec minification et resource shrinking produisent la taille minimale. Le Product Flavor affecte également la taille : une version gratuite sans bibliothèques payantes sera plus petite que la version payante de la taille de ces bibliothèques.

Résumé

  • Build Variant — combinaison d’un Build Type et d’un Product Flavor qui définit la configuration de compilation.
  • Build Type contrôle le mode de compilation (debug/release/staging), tandis que Product Flavor contrôle la version du produit (free/paid).
  • Source sets permettent de remplacer le code, les ressources et le manifeste pour chaque variante de compilation.
  • VariantFilter désactive les combinaisons inutiles, accélérant la configuration Gradle de 30–50%.
  • Projets multimodules nécessitent une synchronisation des flavors dans tous les modules ou la publication de plusieurs variantes.
  • BuildConfigField et les source sets sont deux manières propres de personnaliser le comportement entre les variantes.
  • Recommandation : ne créez pas plus de 10–12 variantes dans un projet ; regroupez les dimensions de manière significative.

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi