如何在 Gradle 构建脚本(Android)中定义和使用常量?
Posted
技术标签:
【中文标题】如何在 Gradle 构建脚本(Android)中定义和使用常量?【英文标题】:How to define and use a constant in Gradle build script (Android)? 【发布时间】:2016-01-25 14:54:50 【问题描述】:我正在开发一个使用 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
。
【问题讨论】:
Is it possible to declare a variable in Gradle usable in Java?的可能重复 @Maloubobola 它不是重复的。我已经看到了这个问题(以及其他一些问题)。我知道如何声明 buildConfigFields,我已经有很多了。我的问题是关于 reusing 与buildConfigField
和 applicationId
相同的值。
【参考方案1】:
只有我不确定如何定义 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 代码或其他方式定义全局变量。
【讨论】:
实际上它应该是buildConfigField 'String', 'ORANGE_PRO_PACKAGE', '"' + ORANGE_PRO_PACKAGE + '"'
,否则该值不会在 BuildConfig 中生成为字符串文字并且构建中断。但除此之外 - 它有效,感谢您的提示。
是否可以为每种口味使用不同的.properties
文件?一个优点是,这种方式可以在不同风味中保留相同的键(在 gradle.properties 中)。由于文件会更改,因此基于风味,这些键的值会有所不同。如果将相同的gradle.properties
文件用于值根据风味而变化的字符串,我们将需要在相同的.properties
文件中具有不同的键,随着时间的推移,这些键更难维护。
@ShobhitPuri:“是否可以为每种口味使用不同的 .properties 文件?” - AFAIK 没有什么是自动的。但 Gradle 是 Groovy,因此您可以从开发机器中读取您想要在构建脚本中使用的任何文件。以上是关于如何在 Gradle 构建脚本(Android)中定义和使用常量?的主要内容,如果未能解决你的问题,请参考以下文章
Android Gradle 插件组件化中的 Gradle 构建脚本实现 ③ ( 在 Gradle 构建脚本中实现 AndroidManifest.xml 清单文件切换设置 )
Android -- 每日一问:如何理解 Gradle?Gradle 在 Android 的构建过程中有什么作用?
如何在 gradle kts 中排除(忽略)android 构建变体
Android Gradle 插件组件化中的 Gradle 构建脚本实现 ④ ( 使用路由实现组件间通信 | 引入 ARoute 框架 | Gradle 构建脚本优化问题 )
Android Gradle 插件Gradle 构建机制 ⑤ ( 在 Android Studio 中查看 Android Gradle 插件源码 )
Android Gradle 插件Android Studio 工程 Gradle 构建流程 ② ( settings.gradle 构建脚本分析 | 根目录下 build.gradle 分析 )