最近在做项目制的开发,有一套开发好的产品原型的代码,然后根据不同的客户进行不同的定制开发。如果一个项目搞一个分支,要多开多个as,还有一个缺点就是如果产品原型的代码进行了变更和优化,所有的项目分支都要将产品修改后果的代码复制转移一次,麻烦!
build.gradle可以帮我们解决这个问题。
一.先来讲重点,配置变种:
1.在android { } 中增加如下代码,适用于as建立的项目,eclipse转换过来的项目需要增加sourceSets {}
// 维度组合,productFlavors中不同种类的dimension可以组合,名字根据实际需要自己取
flavorDimensions "mode", "channel"
productFlavors {
trunk {
// 维度小组名称
dimension "mode"
// 修改项目包名,在清单文件中的包名后增加后缀;
// 也可以使用applicationId "com.xx.xx" 替换掉默认的包名
applicationIdSuffix ".trunk"
// 编译后会自动生成在BuildConfig.java中,代码中通过使用BuildConfig.IPADRESS获取后面的值
// 参数规则“String”表示参数类型,也可以是boolean等,"IPADRESS"是常量名称,最后一个是内容
buildConfigField "String", "IPADRESS", "\"192.168.x.xx:8080\""
// 还可以增加各种不同的配置,defaultConfig中配置这里都可以用,重复的配置这里的会覆盖掉defaultConfig
}
guiyang {
dimension "mode"
applicationIdSuffix ".guiyang"
buildConfigField "String", "IPADRESS", "\"192.168.x.xx:8082\""
}
huawei{
dimension "channel"
// 给清单文件中的渠道占位符赋值
manifestPlaceholders = [CHANNEL_VALUE:"huawei"]
}
xiaomi{
dimension "channel"
manifestPlaceholders = [CHANNEL_VALUE:"xiaomi"]
}
2.在工程目录中新增如下目录
如果productFlavors中没有main:main为默认目录,每个组合都会含有main中的代码;
如果productFlavors中有main:main也相当于一个风味,不会和trunk合并(根据实际需要,trunk既可以是main的扩展也可以和main平级,完全看自己怎么配置)
trunk和guiyang(注意:文件夹名称要和productFlavors中的名字对应)中放各个定制项目中的差异代码,其下的目录结构文件非必须,如果需要修改main中的资源或新增代码,就在各自项目中增加对应的文件夹和文件,如果没有修改可以只有个主目录
trunk/guiyang和main中的文件合并规则如下:
图片、音频、 XML 类型的 Drawable ,layout等资源文件,将会进行文件级的覆盖
字符串、颜色值、整型等资源以及 AndroidManifest.xml ,将会进行元素级的覆盖
代码资源,同一个类, buildTypes 、 productFlavors 、 main 中只能存在一次,否则会有类重复的错误
覆盖等级为:buildTypes > productFlavors > m