在开发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. 有没有办法解决如下问题呢?
能够构建不一样环境的Apk
不须要修改代码
可使用不一样的签名
利用gradle
能够解决上面的三个问题,下面就看下如何使用gradle
解决上面的问题吧!
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
中配置不一样的环境。
虽然经过gradle
中能够配置ENV_SETTING
变量,经过buildConfigField
可让java代码获取到设置的值。可是在buildTypes中只能设置两个变量release
和debug
:
buildTypes { release { signingConfig signingConfigs.release buildConfigField("int", "ENV_SETTING", "2") } debug { buildConfigField("int", "ENV_SETTING", "0") } }
buildTypes
中只有两种配置,在build的时候只能生产出两个Apk:debug和release,须要第三种环境的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
的配置,能够经过buildConfigField
给ENV_SETTING
从新赋值,它会覆盖buildTypes.release
的配置。 这样就有了三种不一样的build配置。
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
进行设置。