Android-构建不一样环境的Apk

在开发Android过程当中,经常须要构建不一样环境的Apk,好比咱们有可能会须要有三个环境javascript

  • 开发环境
  • 测试环境
  • 线上环境

三种环境对应不一样的服务器地址:java

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环境:app

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

这样能够经过设置ENV_SETTING构建不一样的Apk:dom

  • 开发的时候使用默认dev环境
  • 测试的时候给test环境
  • 发布的时候使用release环境

可是这样作却有一些问题,就是每次必须修改ENV_SETTING的值,每次更改都会致使版本库变更,产生新的提交,若是提交以后的话,其余的开发者不必定会知道版本库的变更,致使环境不一样产生错误,还有可能环境不对,生产出了错误环境的Apk. 有没有办法解决如下问题呢?工具

  1. 能够构建不一样环境的Apk
  2. 不须要修改代码
  3. 可使用不一样的签名
    利用gradle能够解决上面的三个问题,下面就看下如何使用gradle解决上面的问题吧!

buildConfigField

buildConfigField是gradle的一个方法,他的做用是能够给BuildConfig添加变量,赋值等。它的使用: 测试

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

这样就给BuildConfig中新增长了一个变量EN_SETTING,新增的代码以下:ui

// Fields from build type: debug
  public static final int ENV_SETTING = 0;复制代码

在代码中使用BuildConfig新增的变量EN_SETTING:url

//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
  • assembleReleaseTest

这样就能够根据须要构建不一样的Apk,不须要更改代码就能够构建不一样环境的Apk,并且生成的Apk的名字也能区分出不一样的环境,经过上面的配置能够构建出三种Apk:

  • app-debug.apk
  • app-release.apk
  • app-releaseTest.apk

还能够根据上面的配置须要设置不一样的Apk签名,经过signingConfig进行设置。

相关文章
相关标签/搜索