是否有可能在Gradle中聲明一個可用於Java的變量?


Answers

在Android應用程序(Java和XML)中使用Api App Key的一個示例

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" />
Question

是否有可能在Gradle中聲明一個可用於Java的變量? 基本上我想在build.gradle中聲明一些變量,然後在構建時明顯地獲得它。 就像C / C ++中的預處理器宏一樣...

聲明的一個例子就是這樣的......:

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

有沒有辦法做這樣的事情?




在構建期間,您可以通過系統環境變量創建構建配置字段。

開發時使用回退,但在Jenkins或其他工具上運行構建時,可以覆蓋該變量。

在你的應用程序build.gradle中

buildTypes {
        def serverUrl =  '\"' + (System.getenv("SERVER_URL")?: "http://default.fallback.url.com")+'\"'
        debug{
            buildConfigField "String", "SERVER_URL", serverUrl
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            buildConfigField "String", "SERVER_URL", serverUrl
        }
    } 

該變量將以BuildConfig.SERVER_URL形式提供。