有可能在Gradle中声明一个变量在Java中可用吗? 基本上,我想在构建中声明一些变量。Gradle,然后在构建时获得它(显然)。就像C/ c++中的预处理器宏…

声明的一个例子是这样的…:

android {
    debug {
        A_VAR_RETRIEVABLE_IN_JAVA = 42
    }
    release {
        A_VAR_RETRIEVABLE_IN_JAVA = 42+52
    }
}

有这样的方法吗?


当前回答

这里有两种方法从Gradle传递值到Java中使用;

生成Java常量

android {
    buildTypes {
        debug {
            buildConfigField "int", "FOO", "42"
            buildConfigField "String", "FOO_STRING", "\"foo\""
            buildConfigField "boolean", "LOG", "true"
        }

        release {
            buildConfigField "int", "FOO", "52"
            buildConfigField "String", "FOO_STRING", "\"bar\""
            buildConfigField "boolean", "LOG", "false"
        }
    }
}

您可以通过BuildConfig访问它们。喷火

生成Android资源

android {
    buildTypes {
        debug{
            resValue "string", "app_name", "My App Name Debug"
        }
        release {
            resValue "string", "app_name", "My App Name"
        }
    }
}

您可以使用@string/app_name或R.string.app_name以通常的方式访问它们

其他回答

这是针对在Java和Kotlin中都可用的Kotlin DSL (build.gradle.kts):

buildTypes {
    getByName("debug") { // or simply  debug {  in newer version of Android Gradle Plugin (AGP)
        buildConfigField("Boolean", "isHappy", "true")
        buildConfigField("String", "favoriteSong", """"Black Forest"""")
        resValue("string", "myName", "Lind")
    }
}

我正在使用这段代码,工作得很好。

def baseUrl = '\"http://patelwala.com/myapi/"'
def googleServerKey = '\"87171841097-opu71rk2ps35ibv96ud57g3ktto6ioio.apps.googleusercontent.com"'
android {
  buildTypes {
  release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField 'String', 'BASE_URL', baseUrl
        buildConfigField 'String', 'web_client_id', googleServerKey
    }
    releasedebug {
        initWith debug
        buildConfigField 'String', 'BASE_URL', baseUrl
        buildConfigField 'String', 'web_client_id' ,googleServerKey
    }
    debug {

        buildConfigField 'String', 'BASE_URL', baseUrl
        buildConfigField 'String', 'web_client_id', googleServerKey
    }
 }
}

}

在Android应用程序(Java和XML)中使用Api应用程序密钥的示例

gradle.properties

AppKey="XXXX-XXXX"

build.gradle

buildTypes {
//...
    buildTypes.each {
        it.buildConfigField 'String', 'APP_KEY_1', AppKey
        it.resValue 'string', 'APP_KEY_2', AppKey
    }
}

在java代码中的使用

Log.d("UserActivity", "onCreate, APP_KEY: " + getString(R.string.APP_KEY_2));

BuildConfig.APP_KEY_1

xml代码中的用法

<data android:scheme="@string/APP_KEY_2" />

链接到Android应用程序中Api App Key使用的示例 使用Gradle构建配置生成的字符串常量

如何将函数的字符串结果插入到buildConfigField

下面是一个以人类可读格式设置的构建日期示例:

def getDate() {
    return new SimpleDateFormat("dd MMMM yyyy", new Locale("ru")).format(new Date())
}

def buildDate = getDate()

defaultConfig {
    buildConfigField "String", "BUILD_DATE", "\"$buildDate\""
}

https://stackoverflow.com/a/17201265/12021422回答@rciovati作品

但请确保您重新构建项目,以便能够从Android Studio IDE中删除错误

我花了30分钟试图弄清楚为什么不能访问新的属性变量。

如果红色标记的“创建项目”不工作,则尝试绿色标记的“重建项目”按钮。