需求:
在產品開發中,經常需要發佈各個版本,每個版本的服務器地址有不同的服務器地址。比如
- 開發服務器使用 192.168.1.232服務器,
- 測試服務器使用 192.168.1.245服務器,
-
正式上線後服務器地址是http://xxxx.com。
在配合git開發中還要分支管理,常用的有: -
dev
- test
- master
我們起初的開發過程是:
1.在項目開始時,開發人員寫代碼,簽入代碼到dev分支。開發人員使用 開發服務器的服務器地址
2.在啓動測試時,開發組負責人合併代碼到 test 測試分支。測試組負責人要修改代碼中 服務器地址的源文件,更改爲 測試服務器的地址,打包分發到測試組成員開始測試。
3.測試完畢後,測試組負責人合併代碼到 master 分支,修改服務器地址爲 上線服務器地址,並測試,再到正式發佈。
在上面的這些步驟中我們看到,需要多次修改服務器地址,對相關的技術能力有一定要求,認爲操作還容易操作,比如寫了一個不存在的服務地址。
改進:
引入 Jenkins 服務自動打包,Jenkins是個非常優秀的自動構建工具,可以爲我們的打包提供很棒的體驗。使得 測試人員 在需要時,自己就能進行打包而不需要其他更多操作。當然,這需要我們配置好構建腳本。在使用Android studio之後,就需要了解 gradle腳本了。
技術關鍵詞:
buildConfigField, BuildConfig
思路:
在gradle腳本中,使用 buildConfigField 聲明一個字段,編譯成功後,會爲這個字段生成靜態常量,我們可以在代碼中使用這個常量。而在配合 gradle 的 buildTypes 配置不同的編譯類型(比如測試,開發,上線三種類型),每個類型指定不同的 字段的值。而在成功build後,gradle會爲 美工不同的類型環境生成不同的apk包,比如一次性就生成了 測試,開發,上線三個apk包。
實現方式:
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
}
}
注意上面帶下劃線字體的部分。
這個方法需要三個參數,分別是 字段變量類型,變量名,和值。比如這裏的
"String", "API_HOST", "\"http://192.168.1.245\"" // 一定注意 右斜槓後面跟着 轉義字符分號
就會生成:
public static final String API_HOST = "http://192.168.1.245";
2.修改 build.gradle , 配置 defaultConfig 下的 buildConfigField字段 ,這是爲了 代碼編譯的方便,使得在各個環境下都有 API_HOST 這個字段。
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);
}
}