如何在gradle构建文件中的其他位置访问buildConfigField

时间:2014-04-12 01:29:19

标签: android gradle android-productflavors

我正在尝试在productFlavor块中设置buildConfigField,然后在我的gradle构建文件中的其他位置引用该字段,以便在构造apk的名称时可以使用此值。

e.g

productFlavors{
    flavor1{            
        buildConfigField "String", "APP_FLAVOR_NAME", '"MyApp-Flavor1"'

    }
    flavor2{            
        buildConfigField "String", "APP_FLAVOR_NAME", '"MyApp-Flavor2"'

    }

如何在build.gradle脚本中的其他位置访问APP_FLAVOR_NAME?

我也在努力弄清楚如何在buildscript中引用flavor名称本身作为构建apk名称的另一个选项。我怎么能这样做呢?

2 个答案:

答案 0 :(得分:10)

添加buildConfigField会在BuildConfig.java文件中写入一个条目,并不打算在 buildscript 级别公开。这是一种向感兴趣的应用程序代码提供有关特定构建的元信息的方法 - 而不是其他构建代码。如果要在buildscript级别抛出名称,则需要使用Gradle属性。

显然,如果要访问脚本中其他位置的BuildConfigField对象集合,可以使用android.productFlavors.flavor1.buildConfigFields

修改

要在迭代android.applicationVariants.all时获取特定的风味名称,您可以像这样迭代风味集合(请注意,您不需要捕获对您正在迭代的项目的引用,但它是有启发性的查看您实际访问的对象:

task printFlavors << {
    println "BuildTypes ⨯ Flavors:"
    android.applicationVariants.all { variant ->
        println name
        variant.productFlavors.each { flavor ->
            println flavor.name
        }
    }
}

或者,正如kcoppock所建议的那样,这可以简化为:

task printFlavorName << {
    android.applicationVariants.all {
        println flavorName
    }
}

答案 1 :(得分:0)

想要加入dcow回答。

获得味道后,获取BuildConfig字段:

variant.productFlavors.each { flavor ->
    flavor.buildConfigFields.each { key, value ->
        if(key == "APP_FLAVOR_NAME") {
            println value.type
            println value.name
            println value.value
        }    
    }
}

BuildConfigs被定义为最终类。字段是私有的。所以只能是只读的。