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

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

我的目标是使用一个值(包名)作为 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,我已经有很多了。我的问题是关于 reusingbuildConfigField 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 代码或其他方式定义全局变量。

https://stackoverflow.com/questions/33346918/

相关文章:

build - 错误 : Sonar server 'http://localhost:9000'

c# - 如何在解决方案级别使用 Microsoft.Net.Compilers?

java - 什么是 org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAI

java - 将 Google Guava 添加到 Android 项目 - 显着减慢构建速度

ios - 如何为 iPhone 构建 Boost-Libraries

.net - MSBuild 和 F# 的 FAKE 有什么区别?

c# - 如何在我的应用程序中显示上次构建的内部版本号和/或日期时间?

javascript - 需要一个带有 webpack 的模块

javascript - 如果我仍然在构建时连接所有文件,我为什么要使用 require.js?

visual-studio-2010 - 从命令行发布 Web 应用程序