在 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);
    }


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM