需求:
在產(chǎn)品開發(fā)中厉萝,經(jīng)常需要發(fā)布各個(gè)版本鸥拧,每個(gè)版本的服務(wù)器地址有不同的服務(wù)器地址茉稠。比如
開發(fā)服務(wù)器使用 192.168.1.232服務(wù)器额湘,
測(cè)試服務(wù)器使用 192.168.1.245服務(wù)器秕铛,
正式上線后服務(wù)器地址是http://xxxx.com。
在配合git開發(fā)中還要分支管理缩挑,常用的有:dev
test
master
我們起初的開發(fā)過程是:
1.在項(xiàng)目開始時(shí),開發(fā)人員寫代碼鬓梅,簽入代碼到dev分支供置。開發(fā)人員使用 開發(fā)服務(wù)器的服務(wù)器地址
2.在啟動(dòng)測(cè)試時(shí),開發(fā)組負(fù)責(zé)人合并代碼到 test 測(cè)試分支绽快。測(cè)試組負(fù)責(zé)人要修改代碼中 服務(wù)器地址的源文件芥丧,更改為 測(cè)試服務(wù)器的地址紧阔,打包分發(fā)到測(cè)試組成員開始測(cè)試。
3.測(cè)試完畢后续担,測(cè)試組負(fù)責(zé)人合并代碼到 master 分支擅耽,修改服務(wù)器地址為 上線服務(wù)器地址,并測(cè)試物遇,再到正式發(fā)布乖仇。
在上面的這些步驟中我們看到,需要多次修改服務(wù)器地址询兴,對(duì)相關(guān)的技術(shù)能力有一定要求乃沙,認(rèn)為操作還容易操作,比如寫了一個(gè)不存在的服務(wù)地址诗舰。
改進(jìn):
引入 Jenkins 服務(wù)自動(dòng)打包警儒,Jenkins是個(gè)非常優(yōu)秀的自動(dòng)構(gòu)建工具,可以為我們的打包提供很棒的體驗(yàn)眶根。使得 測(cè)試人員 在需要時(shí)蜀铲,自己就能進(jìn)行打包而不需要其他更多操作。當(dāng)然属百,這需要我們配置好構(gòu)建腳本记劝。在使用Android studio之后,就需要了解 gradle腳本了诸老。
技術(shù)關(guān)鍵詞:
buildConfigField隆夯, BuildConfig
思路:
在gradle腳本中,使用 buildConfigField 聲明一個(gè)字段别伏,編譯成功后蹄衷,會(huì)為這個(gè)字段生成靜態(tài)常量,我們可以在代碼中使用這個(gè)常量厘肮。而在配合 gradle 的 buildTypes 配置不同的編譯類型(比如測(cè)試愧口,開發(fā),上線三種類型)类茂,每個(gè)類型指定不同的 字段的值耍属。而在成功build后,gradle會(huì)為 美工不同的類型環(huán)境生成不同的apk包巩检,比如一次性就生成了 測(cè)試厚骗,開發(fā),上線三個(gè)apk包兢哭。
實(shí)現(xiàn)方式:
1.修改 build.gradle , 配置buildTypes 下的 buildConfigField字段
buildTypes {
release {
minifyEnabled false
buildConfigField("String", "API_HOST", "\"http://www.jinlinbao.com\"")
signingConfig signingConfigs.zyfkey
}
debug245 {
debuggable true
minifyEnabled false
buildConfigField("String", "API_HOST", "\"http://192.168.1.245\"")
signingConfig signingConfigs.zyfkey
}
}
注意上面帶下劃線字體的部分领舰。
這個(gè)方法需要三個(gè)參數(shù),分別是 字段變量類型,變量名冲秽,和值舍咖。比如這里的
"String", "API_HOST", ""http://192.168.1.245"" // 一定注意 右斜杠后面跟著 轉(zhuǎn)義字符分號(hào)
就會(huì)生成:
public static final String API_HOST = "http://192.168.1.245";
2.修改 build.gradle , 配置 defaultConfig 下的 buildConfigField字段 ,這是為了 代碼編譯的方便,使得在各個(gè)環(huán)境下都有 API_HOST 這個(gè)字段锉桑。
buildConfigField("String", "API_HOST", ""http://192.168.1.232"")
3.開始 build 排霉,完成后,可以在代碼中使用:
String str = BuildConfig.API_HOST;
完整腳本
下面是完整的 配置腳本:
apply plugin: 'com.android.application'
android {
signingConfigs {
zyfkey {
keyAlias '-'
keyPassword '-'
storeFile file('/Users/zhangyunfei/git/vocabulary/zhangyf.keystore')
storePassword '-'
}
}
compileSdkVersion 19
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "vir56k.vecabulary"
minSdkVersion 14
targetSdkVersion 19
versionCode 1
versionName "1.0"
buildConfigField("String", "API_HOST", "\"http://192.168.1.232\"")
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
buildConfigField("String", "API_HOST", "\"http://www.jinlinbao.com\"")
signingConfig signingConfigs.zyfkey
}
debug245 {
debuggable true
minifyEnabled false
buildConfigField("String", "API_HOST", "\"http://192.168.1.245\"")
signingConfig signingConfigs.zyfkey
}
}
productFlavors {
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
下面是代碼演示:
package vir56k.vecabulary;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String str = BuildConfig.API_HOST;
TextView txt1 = (TextView) findViewById(R.id.txt1);
txt1.setText(str);
}
}