user1610950
user1610950

Reputation: 1917

Android Studio buildflavors

Getting started with the new android studio it seems very flexible but that usually brings a steep learning curve. Hoping to get some help with that here.

I've built an app and deployed it with this build.gradle file

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "me.test.simpleProject
        minSdkVersion 10
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    signingConfigs {
        release {
            storeFile file("../my.keystore.jks")
            storePassword System.getenv("and_ks_pw")
            keyAlias System.getenv("and_ky_alias")
            keyPassword System.getenv("and_k_pw")
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            debuggable true
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'

    compile project(":Library:lib_my_lib_a")
    compile project(":Library:lib_my_lib_b")
    compile project(":Library:lib_my_lib_c")
}

This works pretty well and once I learn the syntax it'll be much easier to use than the previous system.

Now my question.

I would like to basically add a few product flavors.

I currently use google analytics to track clicks, usage stats, simple things like that.

In the past [before android studio] typically distribute my apps in a free/ paid version.

I would like to create say build flavors for: google play free google play paid amazon free amazon paid

The code for these apps should be mostly identical but they cannot be since, for example adding links to google play in your amazon apps gets you in a bit of trouble over there. So I will need to have unique classes across the build flavors.

I was reading some docs and watching google talks about setting up the build flavors but I am a bit confused.

Can someone help me define the folder structure for this project?

current application structure

test/
.gradle/
.idea/
app/
app/build
app/libs <-- empty
app/src
app/.gitignore
app/app.iml
app/build.gradle
app/proguard-rules.pro
build/
gradle/
Library/lib_a
Library/lib_b
Library/lib_c
.gitignore
build.gradle
gradle.properties
gradlew
gradlew.bat
local.properties
settings.gradle
test.iml

Can I place the new folders anywhere and how do I link them up with grade to properly build the variants?

Upvotes: 2

Views: 591

Answers (2)

Gabriele Mariotti
Gabriele Mariotti

Reputation: 363439

To use flavors in your app you should have a structure like this:

   app
       src
         flavor1
             java
             res
         flavor2
           java
           res
         main
           java
           res

You have to define the flavors in the build.gradle:

productFlavors {
    flavor1 {
        //
    }
    flavor2 {
        //
    }
}

Then you can have different dependencies using:

dependencies {
    releaseCompile 
    debugCompile 
    flavor1Compile 
    flavor1DegubCompile 
}

For example:

 dependencies {
     freeCompile 'com.google.android.gms:play-services:7.5.0'
 }

Upvotes: 0

unbekant
unbekant

Reputation: 1555

The first thing you should do, is add these flavors to your gradle script, inside the android section:

productFlavors {
    googleFree {
        applicationId = "com.your.app.gfree"
    }
    googlePaid {
        applicationId = "com.your.app.gpaid"
    }
    amazonFree {
        applicationId = "com.your.app.afree"
    }
    amazonPaid {
        applicationId = "com.your.app.apaid"
    }
}

Note that you can define different package names for your app if needed, as well as some additional properties. Full details: Gradle Plugin - Build Variants

At this point you will have three different concepts in your app now:

Build types: Debug and Release

Product flavors: googleFree, googlePaid, amazonFree and amazonPaid

Build variants: Combination of build types and flavors

googleFreeDebug googleFreeRelease googlePaidDebug googlePaidRelease amazonFreeDebug amazonFreeRelease amazonPaidDebug amazonPaidRelease

Flavor Specific resources:

For defining resources, you should have:

app
  src        
    main
      java
      res
    googlePaid
      java
      res
    googleFree
      java
      res
    amazonPaid
      java
      res
    amazonFree
      java
      res

With that structure in place, you can place all your shared stuff under main, while the flavor specific stuff would live on each flavor's folder. Then, when building a specific variant of your app, android and gradle will resolve the right resources for you. If you are interested in more details, see Resource Merging.

Once the flavors have been added to your build.gradle file, if you sync your project, Android Studio will be able to pick your build variants and you may select these from the IDE:

Build Variants

Upvotes: 3

Related Questions