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

How to define and use a constant in Gradle build script (Android)?

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

我的objective是使用一个值(包名)作为applicationId:

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

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

此访问必须来自 flavor 之外(即,应用的免费版本需要知道付费版本的包名称,以便它可以提示用户在 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 and applicationId.

相同的值

Only I'm not sure how to define orangeProPackage so that it's visible in the entire build.gradle and doesn't break the script.

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

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp

然后您在 build.gradle:

中将其作为简单的全局字符串变量 (ORANGE_PRO_PACKAGE) 引用
buildConfigField 'String', 'ORANGE_PRO_PACKAGE', '"' + ORANGE_PRO_PACKAGE + '"'

it would be best if I could somehow group all these constants

任何涉及 .properties 文件的内容都无法处理。在那里,您可能正在寻找在顶级 build.gradle 文件中以纯 Groovy 代码或其他方式定义全局变量。

您可以使用这样的扩展程序:

// Top-level 构建文件,您可以在其中添加所有 sub-projects/modules.

通用的配置选项

构建脚本{

ext.kotlin_version = '1.6.10'

ext.app_version_code = 1010

ext.app_version_name = '1.0.1.0'

}