如果你還在使用一個java文件聲明靜態(tài)變量來配置接口環(huán)境及其他環(huán)境,每次打包發(fā)布需要不斷取消注解。那么恭喜你下文你剛好用得到。
- 開擼之前,捋一下最后需要達到什么效果呢?
- 支持最少三中接口環(huán)境配置
- 支持配置多個第三方AppKey
- apk文件命名與環(huán)境對應(yīng)(xx-v1.0.1-debug.apk)
- 不同環(huán)境可同時安裝(可選)
- 使用不同的ApkName,不同得LOGO
- 不同環(huán)境打不同的包名
** 寶典 “build.gradle + gradle.properties +BuildConfig.java+占位符” **
首先,要認識下BuildConfig.java這個文件。
在我們使用build.gradle文件進行同步編譯時,都會在module目錄下的build文件夾中創(chuàng)建一個BuildConfig.java文件。
**double Shift **輸入 BuildConfig 你就能找到此文件。這個文件是gradle自己生成的。用于保存你在build.gradle文件中的配置信息。路徑是主包名根路徑下(單獨放在build目錄下而已)。所以在整個項目中我們都可以直接使用BuildConfig.XX來引用對應(yīng)屬性。

BuildConfig.java 每次項目編譯后都會刷新,重新寫入。
進來一看你就會發(fā)現(xiàn),BuildConfig文件中生成的屬性全是
public static final 。這完全就是個典型的配置文件,不同的是它會根據(jù)gradle配置自動刷新重新寫入。看到這里,套路就明顯了:在gradle文件中針對不同打包編譯環(huán)境,配置我們各種環(huán)境配置屬性即可達到我們的目的。
正式開擼
為了實現(xiàn)上面提到要求,這里配置三種打包環(huán)境,默認debug模式,渠道包測試,渠道包正式。
-
配置需要用到的環(huán)境地址
為了讓build.gradle文件中更簡潔,這里利用build.gradle文件可以直接引用gradle.properites中的屬性,將接口配置先寫在此文件中。
如下圖
Paste_Image.png
注意:在.properites文件賦值遵守的格式要完全同Java語言中一至,否則就會變成這樣下面這樣,造成編譯失敗
public static final String NODE_JS = http://xx.xx.x:222/;
OK,上面配置了兩個接口環(huán)境,一個正式,一個debug.每個對應(yīng)三個接口和一個激光AppKey。
- 在build.gradle中引用配置
寫入BuildConfig文件需要使用buildConfigField屬性,根據(jù)占位符配置AndroidManifest.xml文件。
在AndroidManifest.xml文件中添加占位符
<meta-data
android:name="JPUSH_APPKEY"
android:value="${JPUSH_APPKEY_VALUE}"/>
- 為debug添加環(huán)境配置,這一步完成,直接Run得到的debug包就會使用下面參的數(shù)
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
//當(dāng)出現(xiàn)3個或者3個以上環(huán)境和多個渠道時,線上不提供debug打包方式。
//直接使用特定渠道包作為測試包,指定不同包名
debug {
signingConfig signingConfigs.config
buildConfigField 'String','BASE_URL',BASE_URL_DEBUG
buildConfigField 'String','H5_BASE_URL',H5_BASE_URL_DEBUG
buildConfigField 'String','NODE_JS',NODE_JS_DEBUG
buildConfigField 'boolean','IS_TEST','true'
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "debug"
,JPUSH_APPKEY_VALUE: JPUSH_KEY_TEST]
}
}
- 配置渠道包
在AndroidManifest.xml添加渠道配置占位符
<!-- 配置渠道區(qū)分占位符 -->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
添加兩個渠道包配置,使用manifestPlaceholders 屬性,配置好激光AppKay
productFlavors {
istest{
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "istest"
,JPUSH_APPKEY_VALUE: JPUSH_KEY_TEST]
}
fromal {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "fromal"
,JPUSH_APPKEY_VALUE: JPUSH_KEY_FORMAL]
}
}
為不同渠道包配置不同接口環(huán)境
productFlavors.each {
flavors ->
//線上打包測試環(huán)境
if(flavors.name.equals("istest")){
//指定包名為.istest
// flavors.applicationIdSuffix '.istest'
flavors.buildConfigField 'String','BASE_URL',BASE_URL_TEST
flavors.buildConfigField 'String','H5_BASE_URL',H5_BASE_URL_TEST
flavors.buildConfigField 'String','NODE_JS',NODE_JS_TEST
flavors.buildConfigField 'boolean','IS_TEST','true'
//線上打包正式渠道包
}else{
flavors.buildConfigField 'String','BASE_URL',BASE_URL_FORMAL
flavors.buildConfigField 'String','H5_BASE_URL',H5_BASE_URL_FORMAL
flavors.buildConfigField 'String','NODE_JS',NODE_JS_FORMAL
flavors.buildConfigField 'boolean','IS_TEST','false'
}
}
接口環(huán)境配置就是這么簡單,看看BuildConfig文件生成后的樣子吧

我們配置的所有接口環(huán)境在這里生成了對應(yīng)的屬性,你只需要在把他當(dāng)成普通的(不是親生的)配置文件來用即可,無需在添加其他配置文件。
除了接口屬性,多出來的是其他的配置,與此文無關(guān)直接忽略。
- 為了方便區(qū)分,我們還想在生成apk文件時對命名做點手腳,代碼很簡單直接上代碼。
//修改生成的apk名字及輸出文件夾
applicationVariants.all { variant ->
variant.outputs.each { output ->
//新名字
def newName
//時間戳
def timeNow
//輸出文件夾
def outDirectory
//是否為Jenkins打包,輸出路徑不同
if ("true".equals(IS_JENKINS)) {
//BUILD_PATH為服務(wù)器輸出路徑
timeNow = BUILD_TIME
outDirectory = BUILD_PATH_JENKINS
//xx-v1.0.1-release.apk
newName = APPNAME+'-v'+APP_VERSION + '-'+variant.productFlavors[0].name +'-' + variant.buildType.name + '.apk'
output.outputFile = new File(outDirectory+"/"+timeNow, newName)
} else {
//本機打包輸出在本機路徑
outDirectory = BUILD_PATH_LOCAL
if ("debug".equals(variant.buildType.name)){
newName = APPNAME+'-v'+APP_VERSION + '-' + variant.buildType.name +'.apk'
}else {
newName = APPNAME+'-v'+APP_VERSION + '-' + variant.buildType.name +'-'+getDate()+ '.apk'
}
output.outputFile = new File(outDirectory, newName)
}
}
}
上面代碼種,我們修改了apk生成路徑及根據(jù)環(huán)境來命名。
下圖時我更換版本號以后生成的兩個apk文件。

- 如何安裝一個測試的同時,再安裝一個生成呢?
為主包名添加一個包名后綴,他就會完全變成一個新的apk包。
在上面渠道配置我注釋了這一行。
debug時同樣可以加入,只是最后的包名會變成com.xx.debug.istest
很難受還是不要加了。
//指定包名為.istest
// flavors.applicationIdSuffix '.istest'
- 不同環(huán)境設(shè)置不同的AppName 和logo?
這時候分兩種,debug,和渠道包
先說debug模式,再src目錄下創(chuàng)建debug文件夾,創(chuàng)建res文件夾,拷貝進你想修改的資源文件即可,我這里只是在原appName基礎(chǔ)上加了debug-標(biāo)識,所以只需要string文件。
如果你想換logo,與上同理

- 渠道包配置不同appName或者logo
上面我們提到,如何同時安裝不同環(huán)境的apk包,需要為渠道包添加包名后綴。
上面舉例flavors.applicationIdSuffix '.istest',這里包名后綴為 istest。
這時候我們在src目錄下新建istest文件夾,創(chuàng)建res目錄拷貝對應(yīng)資源文件進行修改即可。
此前學(xué)習(xí)部署了Jenkins這個東西,并遺留了動態(tài)切換環(huán)境的問題。所以最近擼出了這個東西。一石頭二鳥哈哈。
收工!如果你有什么問題或建議歡迎下方留言。
