在開發Android
過程當中,經常須要構建不一樣環境的Apk,好比咱們有可能會須要有三個環境java
開發環境服務器
測試環境app
線上環境dom
三種環境對應不一樣的服務器地址:工具
public static final String DEV_URL = "http://dev.domain.com/"; public static final String TEST_URL = "http://test.domain.com/"; public static final String RELEASE_URL = "http://www.domain.com/";
可使用一個變量配置使用不一樣的環境:測試
//0 dev //1 test //2 release public static final int ENV_SETTING = 0;
定義一個獲取不一樣環境url的方法,默認爲dev
環境:gradle
public static String getBaseUrl() { switch (ENV_SETTING) { case 1: return TEST_URL; case 2: return RELEASE_URL; default: return DEV_URL; } }
這樣能夠經過設置ENV_SETTING構建不一樣的Apk:ui
開發的時候使用默認dev環境url
測試的時候給test環境debug
發佈的時候使用release環境
可是這樣作卻有一些問題,就是每次必須修改ENV_SETTING的值,每次更改都會致使版本庫變更,產生新的提交,若是提交以後的話,其餘的開發者不必定會知道版本庫的變更,致使環境不一樣產生錯誤,還有可能環境不對,生產出了錯誤環境的Apk. 有沒有辦法解決如下問題呢?
能夠構建不一樣環境的Apk
不須要修改代碼
可使用不一樣的簽名
利用gradle
能夠解決上面的三個問題,下面就看下如何使用gradle
解決上面的問題吧!
buildConfigField
是gradle的一個方法,他的做用是能夠給BuildConfig添加變量,賦值等。它的使用:
buildConfigField("int", "ENV_SETTING", "0")
這樣就給BuildConfig
中新增長了一個變量EN_SETTING
,新增的代碼以下:
// Fields from build type: debug public static final int ENV_SETTING = 0;
在代碼中使用BuildConfig
新增的變量EN_SETTING
:
//0 dev //1 test //2 release public static final int ENV_SETTING = BuildConfig.ENV_SETTING;
buildConfigField
經過BuildConfig
類能夠把gradle
裏的配置傳遞給Java代碼。只是傳遞給了Java值還不能解開始說的三個問題。下面再看下如何在gradle
中配置不一樣的環境。
雖然經過gradle
中能夠配置ENV_SETTING
變量,經過buildConfigField
可讓java代碼獲取到設置的值。可是在buildTypes中只能設置兩個變量release
和debug
:
buildTypes { release { signingConfig signingConfigs.release buildConfigField("int", "ENV_SETTING", "2") } debug { buildConfigField("int", "ENV_SETTING", "0") } }
buildTypes
中只有兩種配置,在build的時候只能生產出兩個Apk:debug和release,須要第三種環境的Apk,就須要定義一種新的buildTypes
,用來構建測試環境的Apk. 新增長一種buildTypes
:
buildTypes { release { signingConfig signingConfigs.release buildConfigField("int", "ENV_SETTING", "2") } debug { buildConfigField("int", "ENV_SETTING", "0") } releaseTest.initWith(buildTypes.release) releaseTest { buildConfigField("int", "ENV_SETTING", "1") } }
新增長buildTypes
叫作releaseTest
(注意不能使用test開頭)。 它繼承了buildTypes.release
的配置,能夠經過buildConfigField
給ENV_SETTING
從新賦值,它會覆蓋buildTypes.release
的配置。 這樣就有了三種不一樣的build配置。
gradle
經過assmble*
命令能夠打包不一樣buildTypes
的Apk,在右側的gradle工具欄裏面的build菜單欄裏面能夠看到三種不一樣的assemble
:
assembleDebug
assembleRelease
assembleTeleaseTest
這樣就能夠根據須要構建不一樣的Apk,不須要更改代碼就能夠構建不一樣環境的Apk,並且生成的Apk的名字也能區分出不一樣的環境,經過上面的配置能夠構建出三種Apk:
app-debug.apk
app-release.apk
app-releaseTest.apk
還能夠根據上面的配置須要設置不一樣的Apk簽名,經過signingConfig
進行設置。