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

26

我正在使用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,我已经有了很多。我的问题是关于如何将相同的值作为buildConfigFieldapplicationId进行重用


@Maloubobola 这不是重复的问题。我已经看到了那个问题(和其他一些问题)。我知道如何声明buildConfigFields,我已经有很多了。我的问题是关于重用相同的值作为buildConfigFieldapplicationId - Konrad Morawski
2个回答

37

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

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

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp

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

buildConfigField 'String', 'ORANGE_PRO_PACKAGE', '"' + ORANGE_PRO_PACKAGE + '"'

如果我能以某种方式将所有这些常量分组,那就最好了。

涉及到 .properties 文件的任何内容都无法处理这个问题。在这种情况下,您可能需要在顶级build.gradle文件中定义全局变量,只需使用普通的Groovy代码或其他方式即可。


6
实际上,应该是 buildConfigField 'String', 'ORANGE_PRO_PACKAGE', '"' + ORANGE_PRO_PACKAGE + '"',否则在 BuildConfig 中生成的值并不是字符串字面量,构建过程会失败。但除此之外,它很有效,感谢你的提示。 - Konrad Morawski
是否可以为每个风味使用不同的 .properties 文件?一个优点是,这样就可以在各个风味中保留相同的键(在 gradle.properties 中)。根据风味,由于文件会改变,这些键的值也会不同。如果对于一个基于风味变化的字符串使用相同的 gradle.properties 文件,我们需要在同一个 .properties 文件中有不同的键,这样会难以随着时间推移而维护。 - Shobhit Puri
1
@ShobhitPuri:“每个flavour是否可以使用不同的.properties文件?”-- 据我所知,这方面没有自动化的解决方案。但Gradle是Groovy语言编写的,因此您可以在构建脚本中从开发机器上读取任何文件。 - CommonsWare

2
您可以使用类似以下的扩展:

// 顶层构建文件,您可以在其中添加所有子项目/模块通用的配置选项。

buildscript {

    ext.kotlin_version = '1.6.10'

    ext.app_version_code = 1010

    ext.app_version_name = '1.0.1.0'

}

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