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

我正在使用Gradle作为构build系统的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等清晰描述的方式引用它们。

问题是,如何做到这一点?

这是不是重复的是否有可能在Gradle中声明一个可用于Java的variables?

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

  • Android Studio无法加载类'org.codehaus.groovy.runtime.typehandling.ShortTypeHandling'
  • 在Intellij / Android Studio中调试Gradle构建文件
  • 在运行时为Android执行embedded在Java中的Groovy脚本
  • Android Gradle:在构build时dynamic更改versionName
  • 只有我不知道如何定义orangeProPackage,以便它在整个build.gradle中可见并且不会中断脚本。

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

     ORANGE_PRO_PACKAGE=com.morawski.awesomeapp 

    然后在build.gradle其称为一个简单的全局stringvariables( ORANGE_PRO_PACKAGE ):

     buildConfigField 'String', 'ORANGE_PRO_PACKAGE', ORANGE_PRO_PACKAGE 

    如果我能以某种方式组合所有这些常量,那将是最好的

    涉及.properties文件的任何东西都不能处理。 在那里,您可能正在寻找在顶级build.gradle文件中定义纯粹的Groovy代码或全局。