如何一只鸡下多个蛋? 如何一套代码,对应多个版本,多个客户?

实际的开发中遇到这样一个需求:一个产品要供应给不同的客户,绝大部分的逻辑代码和资源文件是一样的,服务器地址是不一样的。难道要把整个项目完整的拷贝一份,建一个新的项目?如果要修改共同的bug,这样就麻烦了。但是,不同的客户后期可能会有不同的需求,需要针对性的进行开发,怎么办?
不卖关子了,我的做法是坚持维护一套代码,同时还可以根据不同客户版本开发不同的功能。
我使用的开发环境是 Android Studio 3.0 Canary 9。利用gradle进行配置。
####1.服务器地址,String资源,不同的依赖
flavorDimensions "server"
productFlavors {
C1_releaseServer {
//BuildConfig.SERVER_ROOT_URL
buildConfigField("String", "SERVER_ROOT_URL", "\"http://211.7.1.224:80/\"")
//R.String.app_name
resValue("string", "app_name", "应用名1")
dependencies {
compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-*.jar')
}
applicationId "com.smart1"
dimension "server"
}
C2_releaseServer {
//BuildConfig.SERVER_ROOT_URL
buildConfigField("String", "SERVER_ROOT_URL", "\"http://211.7.1.224:80/\"")
//R.String.app_name
resValue("string", "app_name", "应用名2")
//依赖配置
dependencies {
compile fileTree(dir: 'libs', include: '*.jar', exclude: 'android-support-*.jar')
}
applicationId "com.smart2"
dimension "server"
}
}
flavorDimensions 是版本的维度,这里只使用了一个维度,如果需要可以使用多个维度。多个维度会进行组合。applicationId 不同是为了一台手机上可以同时安装多个apk。注:AndroidManifest.xml中的package不需要修改。
Module的gradle修改完成之后,运行一下gradle。然后下面就会出现已经配置的Flavors了,可以选择之后,点击运行。注:如果你切换了不同的Flavors,gradle会再次运行一遍。运行之后代码中的BuildConfig.***才会编译成功。

####2.资源文件 不同的版本可能还会用到不同的图片资源。src文件夹下面间对应Flavors的资源文件,这里的资源文件可以是图片或者java文件。


红框里就是对应的Flavors,选择之后,上面是资源文件夹的类型。
文件夹创建好之后,就可以把资源文件拷贝进去了。这里需要注意的是,原来在main文件夹下的同名的文件需要删除。
//和productFlavors同级
sourceSets {
//不同的资源要放在不同的版本对应文件夹中,main中不放,同且公用的资源放在main文件夹下
// C1_releaseServer.java.srcDirs
// C1_releaseServer.manifest.srcFile 'AndroidManifest.xml'
C1_releaseServer.res.srcDirs = ['src/main/res','src/C1_releaseServer/res']
C2_releaseServer.res.srcDirs = ['src/C2_releaseServer/res','src/main/res']
}
最后,运行gradle,然后选择Build Variant,然后再运行gradle,完成后直接运行!