Android Studio中的Gradle配置不同服務器地址以生成不同安裝包”

需求:

  在產品開發中,經常需要發佈各個版本,每個版本的服務器地址有不同的服務器地址。比如

  • 開發服務器使用 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);
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章