需求:
在產品開發中,經常需要發布各個版本,每個版本的服務器地址有不同的服務器地址。比如
-
- 開發服務器使用 192.168.1.232服務器,
- 測試服務器使用 192.168.1.245服務器,
- 正式上線后服務器地址是http://xxxx.com。
在配合git開發中還要分支管理,常用的有:
-
- dev
- test
- master
我們起初的開發過程是:
- 在項目開始時,開發人員寫代碼,簽入代碼到dev分支。開發人員使用 開發服務器的服務器地址
- 在啟動測試時,開發組負責人合並代碼到 test 測試分支。測試組負責人要修改代碼中 服務器地址的源文件,更改為 測試服務器的地址,打包分發到測試組成員開始測試。
- 測試完畢后,測試組負責人合並代碼到 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); } }
