Gradle构建Android差异包
2016-03-23 本文已影响446人
stefanli
【背景说明】
在Android项目开发过程中,需要和服务器进行通信,后台提供的接口区分了测试服务器和正式服务器,作为客户端,需要在测试环境上调试通过,才能发布到正式环境。由于接口API写死在代码中,所以每次测试服务器和正式服务器的切换,都需要修改本地的接口地址,这样做,显然不够灵活,而且也容易出错。那么能否在打包的时候进行配置,使得测试包连接测试服务器地址,正式包连接正式服务器的地址?我相信肯定是可以的,于是有了下面的尝试。
方案一:动态写入配置文件
当我想要解决这个问题的时候,首先想到的是动态写入配置文件,然后在应用启动的时候读取配置文件,这样就可以做到动态切换服务器地址。
主要有三个步骤:
- 在build.gradle文件中,定义一个方法,写入一个xml文件到assets目录下。
def setWebConfig(int type) {
File file = new File("xxx/assets/web_config.xml");
if (file.exists()) {
file.delete();
}
def printWriter = file.newPrintWriter() //
printWriter.write('<?xml version="1.0" encoding="utf-8"?>')
printWriter.write('\n')
switch (type) {
case 0:
printWriter.write('<config_type>release</config_type>')
break;
case 1:
printWriter.write('<config_type>alpha</config_type>')
break;
case 2:
printWriter.write('<config_type>beta</config_type>')
break;
}
printWriter.flush()
printWriter.close()
}
- buildTypes中,调用上面定义的setWebConfig方法,比如:
buildTypes {
release {
setWebConfig(0)
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
alpha {
setWebConfig(1)
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
beta {
setWebConfig(2)
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
- 在应用启动的时候读取assets目录下的xml配置文件,根据内容动态设置当前API地址。
通过以上步骤,就可以在打包的时候,选择不同的类型,应用不同的服务器地址。然而,这并不是最好的方法,在Android Studio里面,我们可以通过BuildConfig来轻松实现这个功能。
方案二:使用BuildConfig
刚刚转到Android Studio开发,很多东西还不熟,通过查询资料发现,Gradle会自动生成一个BuildConfig.java的类文件,这个文件无法手动编译,但是可以通过Gradle动态配置。有了这个特性,解决这个问题就变得很方便了。
直接读取BuildConfig.BUILD_TYPE值,判断包的类型,动态设置服务器地址就可以了。
if (BuildConfig.BUILD_TYPE.equals("release")) {
// TODO xxx
} else if (BuildConfig.BUILD_TYPE.equals("alpha")) {
// TODO xxx
} else if (BuildConfig.BUILD_TYPE.equals("beta")) {
// TODO xxx
} else {
// TODO xxx
}