如何根据gradle风格设置变量

Tor*_*rge 20 android gradle android-ndk cflags

我想传递一个变量test,我为每个flavor设置不同的变量作为NDK的定义.但由于某种原因,他总是传递最后一种味道的价值.

这是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'
}
Run Code Online (Sandbox Code Playgroud)

以下是生成的Android.mk中的CFLAG行

建立/中间体/ NDK/flavorA /调试/ Android.mk:

LOCAL_CFLAGS :=  -DLOGGING=1 -DTEST=2
Run Code Online (Sandbox Code Playgroud)

-DTEST=1在这里期待

建立/中间体/ NDK/flavorB /调试/ Android.mk:

LOCAL_CFLAGS :=  -DLOGGING=1 -DTEST=2
Run Code Online (Sandbox Code Playgroud)

那我的错误在哪里?或者我如何实现目标?还请考虑真正的问题更复杂,我想在可能的情况下在"buildTypes"段中进行这些定义.

Tor*_*rge 13

我找到了解决方案:

首先,而不是def test为所有productFlavors指定一个新字段

productFlavors.all {
    ext.dTest = null
}
Run Code Online (Sandbox Code Playgroud)

然后在每个风格中设置此字段(代码不变)

productFlavors {    
    flavorA {
        dTest = 1
    }

    flavorB {
        dTest = 2
    }    
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以在buildTypes中执行此操作

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

        ndk {
            if (cFlags == null) { cFlags = "" }
            cFlags = cFlags + " -DLOGGING=0 "
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里是完整的文件:

apply plugin: 'com.android.library'

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

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 17

        ndk {
            moduleName "dTest"
            ldLibs "log"
        }
    }

    productFlavors.all {
        ext.dTest = null
    }

    productFlavors {    
        flavorA {
            dTest = 1
        }

        flavorB {
            dTest = 2
        }    
    }


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

            ndk {
                if (cFlags == null) { cFlags = "" }
                cFlags = cFlags + " -DLOGGING=0 "
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)


Pha*_*inh 12

您可以使用 buildConfigField

productFlavors {
    demo {
        buildConfigField "int", "FOO", "1"
        buildConfigField "String", "FOO_STRING", "\"foo1\""
    }
    full {
        buildConfigField "int", "FOO", "2"
        buildConfigField "String", "FOO_STRING", "\"foo2\""
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你将如何从#ifdef中的C访问它?这仅适用于Java AFAIK. (4认同)
  • @sean 只需像 Java 中的 `BuildConfig.FOO` 或 `BuildConfig.FOO_STRING` 一样调用即可。 (2认同)