Android-構建不一樣環境的Apk

在開發Android過程當中,經常須要構建不一樣環境的Apk,好比咱們有可能會須要有三個環境java

  • 開發環境服務器

  • 測試環境app

  • 線上環境dom

三種環境對應不一樣的服務器地址:工具

public static final String DEV_URL = "http://dev.domain.com/";
   public static final String TEST_URL = "http://test.domain.com/";
   public static final String RELEASE_URL = "http://www.domain.com/";

可使用一個變量配置使用不一樣的環境:測試

//0  dev
    //1  test
    //2  release
    public static final int ENV_SETTING = 0;

定義一個獲取不一樣環境url的方法,默認爲dev環境:gradle

public static String getBaseUrl() {
        switch (ENV_SETTING) {
            case 1:
                return TEST_URL;
            case 2:
                return RELEASE_URL;
            default:
                return DEV_URL;
        }
    }

這樣能夠經過設置ENV_SETTING構建不一樣的Apk:ui

  • 開發的時候使用默認dev環境url

  • 測試的時候給test環境debug

  • 發佈的時候使用release環境

可是這樣作卻有一些問題,就是每次必須修改ENV_SETTING的值,每次更改都會致使版本庫變更,產生新的提交,若是提交以後的話,其餘的開發者不必定會知道版本庫的變更,致使環境不一樣產生錯誤,還有可能環境不對,生產出了錯誤環境的Apk. 有沒有辦法解決如下問題呢?

  1. 能夠構建不一樣環境的Apk

  2. 不須要修改代碼

  3. 可使用不一樣的簽名
    利用gradle能夠解決上面的三個問題,下面就看下如何使用gradle解決上面的問題吧!

buildConfigField

buildConfigField是gradle的一個方法,他的做用是能夠給BuildConfig添加變量,賦值等。它的使用:

buildConfigField("int", "ENV_SETTING", "0")

這樣就給BuildConfig中新增長了一個變量EN_SETTING,新增的代碼以下:

// Fields from build type: debug
  public static final int ENV_SETTING = 0;

在代碼中使用BuildConfig新增的變量EN_SETTING:

//0  dev
    //1  test
    //2  release
    public static final int ENV_SETTING = BuildConfig.ENV_SETTING;

buildConfigField經過BuildConfig類能夠把gradle裏的配置傳遞給Java代碼。只是傳遞給了Java值還不能解開始說的三個問題。下面再看下如何在gradle中配置不一樣的環境。

buildTypes

雖然經過gradle中能夠配置ENV_SETTING變量,經過buildConfigField可讓java代碼獲取到設置的值。可是在buildTypes中只能設置兩個變量releasedebug:

buildTypes {
        release {
            signingConfig signingConfigs.release
            buildConfigField("int", "ENV_SETTING", "2")
        }
        debug {
            buildConfigField("int", "ENV_SETTING", "0")
        }


    }

buildTypes中只有兩種配置,在build的時候只能生產出兩個Apk:debugrelease,須要第三種環境的Apk,就須要定義一種新的buildTypes,用來構建測試環境的Apk. 新增長一種buildTypes

buildTypes {
        release {
            signingConfig signingConfigs.release
            buildConfigField("int", "ENV_SETTING", "2")
        }
        debug {
            buildConfigField("int", "ENV_SETTING", "0")
        }
        releaseTest.initWith(buildTypes.release)
        releaseTest {
            buildConfigField("int", "ENV_SETTING", "1")
        }

    }

新增長buildTypes叫作releaseTest(注意不能使用test開頭)。 它繼承了buildTypes.release的配置,能夠經過buildConfigFieldENV_SETTING從新賦值,它會覆蓋buildTypes.release的配置。 這樣就有了三種不一樣的build配置。

assmble*

gradle經過assmble*命令能夠打包不一樣buildTypes的Apk,在右側的gradle工具欄裏面的build菜單欄裏面能夠看到三種不一樣的assemble:

  • assembleDebug

  • assembleRelease

  • assembleTeleaseTest

這樣就能夠根據須要構建不一樣的Apk,不須要更改代碼就能夠構建不一樣環境的Apk,並且生成的Apk的名字也能區分出不一樣的環境,經過上面的配置能夠構建出三種Apk:

  • app-debug.apk

  • app-release.apk

  • app-releaseTest.apk

還能夠根據上面的配置須要設置不一樣的Apk簽名,經過signingConfig進行設置。

相關文章
相關標籤/搜索