7
votes

Android Gradle. Comment combiner des saveurs avec des buildTypes

Je travaille sur une application de marque blanche.

Nous créons une saveur différente par client et chaque client a des API Debug et Production , donc j'essaye de les configurer dans Gradle.

Comment dois-je faire cela?

Voici ce que j'ai essayé:

https://prod.company2.com/api/

EDIT: Je voudrais pouvoir définir une BASE_URL différente pour chaque Flavor et Buildtype.

Flavour company1, BuildType debug

https://dev.company2.com/api/

Flavour company1, version BuildType

https://app.company1.com/prodApi/

Flavour company2, débogage BuildType

https://app.company1.com/devApi/

Flavour company2, version BuildType

buildTypes {
    debug {
        // some configurations
    }
    release {
        // some configurations
    }
}

flavorDimensions "client"
productFlavors {
    company1{
        dimension "client"
        buildConfigField("String", "BASE_URL", "\"https://app.company1/devApi/\"")
    }

    company2 {
        dimension "client"
        buildConfigField("String", "BASE_URL", "\"https://app.company2/devApi/\"")
    }
}


4 commentaires

quelles sont exactement vos exigences que vous souhaitez donner en saveur?


vérifiez ma réponse @kike, vous pouvez modifier selon vos besoins


Salut, @kike, avez-vous la meilleure solution maintenant? J'ai eu le même problème aujourd'hui. Malheureusement, je ne peux pas obtenir une solution satisfaisante uniquement avec Gradle. Je dois enfin définir deux variables dans chaque saveur, une pour le débogage et l'autre pour la publication. Ensuite, dans le code, je vérifie le buildType pour obtenir la bonne valeur. Toute mise à jour?


@Freddie Si ces variables sont très différentes (par exemple, vous ne pouvez pas combiner des chaînes) vous devrez les définir dans un strings.xml séparé. Vérifiez ma réponse ci-dessous et faites-moi savoir si vous avez d'autres questions.


5 Réponses :


0
votes

Vous pouvez utiliser des saveurs pour ajouter des configurations de base pour votre application, qui vont de l ' URL de l'application , des clés API , du mot de passe principal etc. < pre> XXX

Maintenant, si vous vérifiez vos variantes de construction , vous obtiendrez quelque chose comme ceci:

entrer l'image description ici


0 commentaires

2
votes

Voici l'exemple de travail

// Spécifie une dimension de saveur.

String baseURL =BuildConfig.BASE_URL_PATH;

vous pouvez y accéder comme ceci

flavorDimensions "version"

productFlavors {
dev {
    dimension "version"
    applicationId "com.example.lk"
    versionCode 1
    versionName "1.0.1"
    buildConfigField("String", "BASE_URL_PATH", "\"https://app.dev.com/api/v1/\"")
}

prod {
    dimension "version"
    applicationId "com.example.in"
    versionCode 1
    versionName "1.0.1"
    buildConfigField("String", "BASE_URL_PATH", "\"https://app.prod.com/api/v1/\"")

}
staging {
    dimension "version"
    applicationId "com.example.other"
    versionCode 1
    versionName "1.0.1"
    buildConfigField("String", "BASE_URL_PATH", "\"https://app.staging.com/api/v1/\"")

}}




buildTypes {
    release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
      minifyEnabled false
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
  }


0 commentaires

0
votes

Votre principal problème est que vous ne placez pas correctement vos buildTypes pour les saveurs et aucun paramètre correct à l'intérieur de chaque entreprise et je vous suggère également d'en savoir plus sur les configurations Gradle ( developer.android ).

    buildTypes {
        debug {
            // some configurations
        }
        release {
            // some configurations
        }
    }

    flavorDimensions "version", "brand"
    productFlavors {
        dev {
            versionName += "dev"
            dimension "version"

            buildConfigField "String", "BASE_API_URL", "\...\""
        }

        prod {
            dimension "version"

            buildConfigField "String", "BASE_API_URL", "\...\""
        }
        company1{
            dimension "brand"
            versionName "1.0.0"
            buildConfigField("int", "CLONE_ID", "1")
            **here you can set some params, for current clone id: examlpe ->** buildConfigField("boolean", "SHOW_CREDIT_BUY_IN_PROFILE", "true")
        }

        company2 {
            dimension "brand" 
            versionName "1.0.0"
            buildConfigField("int", "CLONE_ID", "2")
            **here you can set some params, for current clone id: examlpe ->** buildConfigField("boolean", "SHOW_CREDIT_BUY_IN_PROFILE", "false")


    }


0 commentaires

2
votes

Essayez quelque chose comme ceci:

buildTypes {
    debug {
        buildConfigField("String", "BASE_URL_PATH", "\"devApi/\"")
    }
    release {
        buildConfigField("String", "BASE_URL_PATH", "\"prodApi/\"")
    }
}

flavorDimensions "client"
productFlavors {
    company1{
        dimension "client"
        buildConfigField("String", "BASE_URL_DOMAIN", "\"https://app.company1/\"")
    }

    company2 {
        dimension "client"
        buildConfigField("String", "BASE_URL_DOMAIN", "\"https://app.company2/\"")
    }
}

Et utilisez-le comme:

Chaîne BASE_URL = BuildConfig.BASE_URL_DOMAIN + BuildConfig.BASE_URL_PATH


2 commentaires

Merci d'avoir répondu. Cela fonctionnerait dans certains cas, mais dans mon cas, j'ai besoin de BASE_URL tous ensemble. Cette URL ne dépend pas de nous et peut être company1.com/apiDebug ou debug.company2.com/api


Mon idée est de diviser l'URL entière en parties et de les mettre en Flavors et BuildTypes. Cela fonctionne même s'il existe une combinaison avec plus de 2 types. c'est-à-dire quelque chose comme Company1-Mobile-Debug, Company2-Tablet-Prod etc. Si vous dites que tout est incertain ici, vous feriez mieux d'utiliser les constantes String dans votre Java et d'utiliser Build Type et Product Flavors avec une instruction Switch pour construire le URL réelle au moment de l'exécution



3
votes

Pour mon problème spécifique, où les URL diffèrent beaucoup les unes des autres, je ne pouvais pas le faire fonctionner avec Flavors et BuildTypes.

J'ai pu définir les URL de débogage / production en utilisant des strings.xml spécifiques pour chaque variante de construction (qui est chaque combinaison de saveur et de type de construction):

Ces sont les structures de dossiers pour ce faire:

src/flavour2Debug/res/values/strings.xml 
src/flavour2Release/res/values/strings.xml 

et

src/flavour1Debug/res/values/strings.xml 
src/flavour1Release/res/values/strings.xml 

EXTRA: Cela peut également être utilisé pour héberger différents fichiers google-services.json


0 commentaires