0

Dans mon application Android, j'ai deux dimensions de saveur: "marque" (brand1, brand2) et "environnement" (staging, production). J'ai ajouté la dimension "environnement" après un certain temps et j'avais précédemment défini quelques variables BuildConfig pour les différentes marques. Pour être plus précis, je définissais la BASE_URL comme ceci:Variables BuildConfig combinées dans les dimensions de dégradé

flavorDimensions 'brand' 
productFlavors { 

    brand1 { 
     dimension 'brand' 
     ... 
     buildConfigField "String", "BASE_URL", "\"http://brand.one.api/\"" 
     ... 
    } 

    brand2 { 
     dimension 'brand' 
     ... 
     buildConfigField "String", "BASE_URL", "\"http://brand.two.api/\"" 
     ... 
    } 
} 

Maintenant, j'ai ajouté la dimension « environnement » et ce que je voudrais mettre en quatre points de terminaison différents:

  1. marque1-mise en scène : "http://brand.one.staging.api/"
  2. marque1-production: "http://brand.one.production.api/"
  3. marque2-mise en scène: "http://brand.two.staging.api/"
  4. marque2-production: "http://brand.two.production.api/ "

Mais je ne peux pas comprendre comment créer une variable BuildConfig pour une combinaison spécifique de dimensions de saveur. Est-ce possible même avec gradle nu?

Merci

Répondre

0

Après une enquête plus poussée, j'ai trouvé un similar question here.

Il semble que vous devez ajouter une fonction à itérer construire des variantes du nom et de vérifier si elles correspondent à un nom souhaité. Mon problème était qu'en fait j'avais 3 dimensions: "marque", "environnement" et "api" (15 pour la production et 21 pour le débogage avec exécution instantanée). Donc, le nom des variantes ressemblerait à brand1Api15StagingDebug, ..., brand2Api21ProductionRelease, ... etc

Ce dont j'avais besoin ici, c'était groovy regex matching combiné avec la question liée ci-dessus. Enfin, la fonction que je fait ressemble à ceci:

android.applicationVariants.all { variant -> 
    if (variant.getName() ==~ /brand1Api[0-9]{2}Staging.*/) { 
     variant.buildConfigField "String", "BASE_URL", "\"http://brand.one.staging.api//\"" 
    } else if(variant.getName() ==~ /brand1Api[0-9]{2}Production.*/){ 
     variant.buildConfigField "String", "BASE_URL", "\"http://brand.one.production.api/\"" 
    } else if(variant.getName() ==~ /brand2Api[0-9]{2}Staging.*/) { 
     variant.buildConfigField "String", "BASE_URL", "\"http://brand.two.staging.api//\"" 
    } else if(variant.getName() ==~ /brand2Api[0-9]{2}Production.*/){ 
     variant.buildConfigField "String", "BASE_URL", "\"http://brand.two.production.api/\"" 
    } else { 
     throw new Exception("Unexpected variant name: " + variant.getName()) 
    } 
} 

J'ai ajouté une touche d'exception à la fin de la chaîne, donc si quelqu'un change les noms de variantes à celles non vérifiées ici, la construction échouerait. Ceci est important pour éviter de créer des applications avec des points de terminaison incorrects.

Fonctionne comme un charme.