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

15

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

例如:

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

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

    }

我该如何在build.gradle脚本的其他地方访问APP_FLAVOR_NAME?

我还在努力弄清楚如何在构建脚本中只引用flavor名称作为构建apk名称的另一种选项。我该怎么做呢?

2个回答

16

添加buildConfigField会在你的BuildConfig.java文件中写入一个条目,并且不应该在buildscript级别下公开。这是一种为感兴趣的应用程序代码提供有关特定构建的元信息的方法--而不是其他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
    }
}

哦,我现在明白你想要什么了。name指的是变量。如果要获取口味名称,你需要像上面编辑的那样做。 - dcow
2
@dcow @JohnRock 变量还有一个 flavorName 字段,您可以使用它。我个人用于命名 APK 输出,我相信这就是您要找的。 :) - Kevin Coppock
@kcoppock 非常有帮助,上次我在查看 Android Gradle 插件时完全错过了这一点。 - dcow
2
希望这些东西有更好的自动完成或文档,但我相信它会随着时间的推移而改善。 - Kevin Coppock
2
是的 - 由于自动完成没有弹出,我没有找到它,但是我使用 ${variant.flavorName} 找到了正确的属性。 - JohnRock
显示剩余2条评论

1

我愿意补充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 是一个 final 类,字段是私有的,因此只能读取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接