How to set variable according to gradle flavors

Torge picture Torge · Mar 16, 2016 · Viewed 14.1k times · Source

I want to pass a variable test that I set differently per flavor as a define to the NDK. But for some reason he always passes the value of the last flavor.

Here is the build.gradle:

apply plugin: 'com.android.library'

def test

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultPublishConfig "flavorARelease"
    publishNonDefault true

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 17

        ndk {
            moduleName "test"
            ldLibs "log"
        }
    }

    productFlavors {    
        flavorA {
            test = 1
        }

        flavorB {
            test = 2
        }    
    }

    buildTypes {    
        debug {
            ndk {
                if (cFlags == null) { cFlags = "" }
                cFlags = cFlags + " -DLOGGING=1 -DTEST="+test+" "
            }
            minifyEnabled false
        }
        release {
            ndk {
                if (cFlags == null) { cFlags = "" }
                cFlags = cFlags + " -DLOGGING=0 -DTEST="+test+" "
            }
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
}

And here are the CFLAG lines from the generated Android.mk

build/intermediates/ndk/flavorA/debug/Android.mk:

LOCAL_CFLAGS :=  -DLOGGING=1 -DTEST=2

I expected -DTEST=1 here

build/intermediates/ndk/flavorB/debug/Android.mk:

LOCAL_CFLAGS :=  -DLOGGING=1 -DTEST=2

So where is my mistake? Or how can I achieve my goal? Please also consider that the real problem is more complex and I want to make those defines in the "buildTypes" segment if possible.

Answer

Linh picture Linh · Sep 19, 2017

You can use buildConfigField

productFlavors {
    demo {
        buildConfigField "int", "FOO", "1"
        buildConfigField "String", "FOO_STRING", "\"foo1\""
    }
    full {
        buildConfigField "int", "FOO", "2"
        buildConfigField "String", "FOO_STRING", "\"foo2\""
    }
}