web-dev-qa-db-fra.com

Exclure des variantes de construction spécifiques

J'ai les deux types de construction par défaut: debug/release et quelques variantes: prod/dev.

Maintenant, je veux exclure la variante de construction dev-release, mais je garde toutes les autres combinaisons possibles. Y a-t-il un moyen d'y parvenir?

42
Kuno

Filtre de variantes

Utilisez le variantFilter du plugin Android gradle pour marquer certaines combinaisons comme ignorées. Voici un exemple tiré de documentation officielle qui fonctionne avec les dimensions de saveur et montre comment il peut être utilisé:

Android {
  ...
  buildTypes {...}

  flavorDimensions "api", "mode"
  productFlavors {
    demo {...}
    full {...}
    minApi24 {...}
    minApi23 {...}
    minApi21 {...}
  }

  variantFilter { variant ->
      def names = variant.flavors*.name
      // To check for a certain build type, use variant.buildType.name == "<buildType>"
      if (names.contains("minApi21") && names.contains("demo")) {
          // Gradle ignores any variants that satisfy the conditions above.
          setIgnore(true)
      }
  }
}

Comme le dit le commentaire, vous pouvez également vérifier le type de construction de la manière suivante:

Android {
    variantFilter { variant ->
        def names = variant.flavors*.name
        if(variant.buildType.name == 'release' && names.contains("myforbiddenflavor")) {
            setIgnore(true)
        }
    }
}
93
ade.se

Lorsque vous travaillez avec des dimensions de goût, essayez celui-ci.

variantFilter { variant ->
    def dim = variant.flavors.collectEntries {
        [(it.productFlavor.dimension): it.productFlavor.name]
    }

    if (dim.dimensionOne == 'paid' && dim.dimensionSecond == 'someVal') {
        variant.setIgnore(true);
    }
}
13
Arkadiusz Konior

Si vous utilisez Dimensions de la saveur faites ceci:

flavorDimensions "device", "server"

productFlavors {
    emulator {
        dimension = "device"
    }
    phone {
        dimension = "device"
    }
    staging {
        dimension = "server"
    }
    production {
        dimension = "server"
    }
}

Android.variantFilter { variant ->
    def device = variant.getFlavors().get(0).name
    def server = variant.getFlavors().get(1).name
    def isRelease = variant.buildType.name.equals('release')
    def isDebug = variant.buildType.name.equals('debug')

    // Disable emulatorProductionRelease build variant
    if (device.equals('emulator') && server.equals('production') && isRelease) {
        variant.setIgnore(true)
    }
}

Il est facile à lire et vous pouvez cibler des variantes de construction spécifiques.

9
Albert Vila Calvo

En utilisant des filtres de variantes comme d’autres, j’ai trouvé qu’il était plus facile de le faire en comparant le nom de la variante à une liste de variantes que je souhaite conserver.

Donc, dans mon fichier app/build.gradle, j'ai quelque chose comme:

Android {
    variantFilter { variant ->
        def needed = variant.name in [
                'stagingQuickDebug',       // for development
                'stagingFullDebug',        // for debugging all configurations
                'stagingFullCandidate',    // for local builds before beta release
                'stagingFullRelease',      // for beta releases
                'productionFullCandidate', // for local builds before going public
                'productionFullRelease'    // for public releases
        ]
        variant.setIgnore(!needed)
    }
    buildTypes {
        debug {
        }
        release {
        }
        candidate.initWith(release)
    }
    flavorDimensions "server", "build"
    productFlavors {
        staging {
            dimension "server"
            buildConfigField "String", "API_URL", '"https://example-preprod.com/"'
        }
        production {
            dimension "server"
            buildConfigField "String", "API_URL", '"https://example.com/"'
        }
        quick {
            dimension "build"
            minSdkVersion 21
            resConfigs("en", "xxhdpi")
        }
        full {
            dimension "build"
        }
    }
}
4
arekolek

Les solutions ici ne fonctionnaient pas pour moi - je tombe sur ce message et ajouta ceci à build.gradle dans mon application et le problème fut résolu pour moi

gradle.taskGraph.whenReady { graph ->
  graph.allTasks.findAll { it.name ==~ /.*MyVariant.*/ }*.enabled = false
}

C’est ce qu’il fait - attend que gradle assemble la liste complète des tâches à exécuter, puis marque toutes les tâches correspondant au modèle de nom comme étant désactivées.

NOTE La correspondance est exacte - l'expression ci-dessus vous permet de faire correspondre toute tâche ayant "MyVariant" quelque part dans son nom et qui respecte la casse

3
Noa Drach

Voir la réponse du filtre de variante ci-dessus.

Ancienne réponse:

Ce n'est pas possible pour le moment, mais c'est quelque chose que nous voulons ajouter. Probablement bientôt.

En attendant, vous pouvez désactiver la tâche d'assemblage, je pense. Quelque chose comme ça:

Android.applicationVariants.all { variant ->
   if ("devRelease".equals(variant.name)) {
       variant.assembleTask.enabled = false
   }
}
1
Xavier Ducrohet

La réponse de @ ade.se n'a pas fonctionné pour moi. Mais j'ai un peu lutté et écrit ceci, cela fonctionne très bien:

Android {
compileSdkVersion 22
buildToolsVersion '20.0.0'

variantFilter { variant ->
    if (variant.buildType.name.equals('debug') || variant.buildType.name.equals('release')) {
        variant.setIgnore(true);
    }
}

defaultConfig {
    applicationId "com.fewlaps.quitnow"
    minSdkVersion 15
    targetSdkVersion 22
    versionCode 35
    versionName "1.35"
}

Le code que vous devez ajouter est le variantFilter one, mais j'ai un peu collé le contexte pour le rendre facile à comprendre.

1
Roc Boronat

Un moyen plus simple

Android.variantFilter { variant ->
    if (variant.name == "qaDebug" || variant.name == "devRelease") {
        setIgnore(true)
    }
}

Ou si vous placez ce code dans la fermeture Android {}, vous pouvez omettre Android.

Android {
    // Please always specify the reason for such filtering
    variantFilter { variant ->
        if (variant.name == "qaDebug" || variant.name == "devRelease") {
            setIgnore(true)
        }
    }
}

S'il vous plaît toujours mettez un commentaire significatif pour des choses comme celle-ci.

0
amatkivskiy