如何在Gradle构建脚本(Android)中定义和使用常量?

时间:2015-10-26 13:24:50

标签: android groovy gradle build android-productflavors

我正在使用Gradle作为其构建系统的Android应用程序。

我的目标是使用值(包名称)作为applicationId

productFlavors {
   orange {
      applicationId "com.fruits.android.orange"
      // ...

但也要通过BuildConfig公开它,以便Java代码可以访问它。

此访问必须来自外部风格(即,应用程序的免费版本需要知道付费版本的软件包名称,以便它可以提示用户在Play商店中进行升级)。

所以我想做那样的事情:

productFlavors {
   orange {
      applicationId orangeProPackage
      // ...


buildConfigField 'String', 'ORANGE_PRO_PACKAGE', "$orangeProPackage" // ?

我只是不确定如何定义orangeProPackage,以便它在整个build.gradle中可见,并且不会破坏脚本。

由于有几种不同的口味,我最好能以某种方式将所有这些常量分组(我猜?):

def proPackages = [
        orange: "..."
        apple: "..."
        banana: "..."
]

然后以干净,描述性的方式引用它们,如proPackages.orange等。

问题是,如何实现这一目标?

这不是Is it possible to declare a variable in Gradle usable in Java?

的副本

我已经看到了这个问题(以及其他一些问题)。我知道如何声明buildConfigFields,我已经有很多了。我的问题是重用buildConfigField applicationId相同的价值。

1 个答案:

答案 0 :(得分:21)

  

只有我不确定如何定义orangeProPackage,以便它在整个build.gradle中可见,并且不会破坏脚本。

您可以将其放在项目根目录中的gradle.properties中。与其他.properties文件一样,它只是一个键值存储:

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp

然后在ORANGE_PRO_PACKAGE中将其称为简单的全局字符串变量(build.gradle):

buildConfigField 'String', 'ORANGE_PRO_PACKAGE', ORANGE_PRO_PACKAGE
  

如果我能以某种方式将所有这些常量分组

,那将是最好的

任何涉及.properties文件的内容都无法处理。在那里,您可能正在考虑使用普通的Groovy代码或其他东西在顶级build.gradle文件中定义全局变量。