android:app1和app2代码融合方案
前言:因为两个app主工程都需要共用,只是存在不同差异的界面和资源图片显示等情况,因此android这边可以采用gradle自带的productFlavors工具来实现多渠道,多app打包方式进行。
1. productFlavors用处
* 创建不同的产品
* 创建不同的产品并为不同产品分配专有属性
* 设置不同代码引用
* 先在src目录下简历对应的文件夹比如java代码则建立productjavares文件夹则建立productres
* 建立包名建立Java类文件
* 在app-level下的gradle文件中设置sourceSets
* 设置不同的产品引入不同的包
1.1 创建不同的产品风味,并为不同产品分配专有属性
在app:级别下的gradle文件中,加入productFlavors,并在productFlavors下创建产品A与B
productFlavors {
//新建产品A
A {
//程序包名
applicationId "com.wmj.a"
//不同渠道号
manifestPlaceholders = [UMC:"product-Complete"]
//versionName
versionName "1.0.0"
//versionCode
versionCode 1
}
//新建产品B
B {
//程序包名
applicationId "com.wmj.b"
//不同渠道号
manifestPlaceholders = [UMC:"product-Temp"]
//versionName
versionName "2.1.1"
//versionCode
versionCode 2
}
1.2 设置不同代码资源等引用
如果项目中对不同产品区分不同的代码,比如服务器地址的区分,或者某些其他常量的区分,或者资源,布局页面都是可以区分的
先在src目录下简历对应的文件夹,比如java代码则建立,product/java,res文件夹则建立product/res
1.3 还可以设置不同的产品引入不同的包
使用方式:产品名Compile “xxx.xxx.xx”
//不同产品引入不同的包
ACompile "com.android.support:appcompat-v7:26.+"
BCompile "com.android.support.constraint:constraint-layout:1.0.2"
1.4 组合多个产品风味
某些情况下,您可能希望组合多个产品风味中的配置。比如像我们app之前就有test环境、预发环境、线上环境,如今又有分app1和app2,那你肯定希望能组合它们,比如组合之后有“app1测试环境debug”、“app1预发环境debug”、“app2预发环境debug”、“app1预发环境release”、“app2预发环境release”等等组合,为此,您可以通过适用于 Gradle 的 Android 插件创建产品风味组,称为风味维度。构建您的应用时,Gradle 会将您定义的每个风味维度中的产品风味配置与构建类型配置组合来创建最终构建变体。Gradle 不会组合属于相同风味维度的产品风味。如下列子说明:
//使用flavorDimensions属性来创建一个“模式”风味维度,维度来区分不同的类型,然后两个类型之间组合
//“dev”指的是编译出来是什么环境的apk
//“app”指的是app1和app2
flavorDimensions "dev","app"
flavorDimensions "dev","app"
productFlavors{
//app2产品,注意(这边的产品名字字母不能大写)
B{
dimension "app"
applicationIdSuffix "com.wmj.b"
versionCode 1
versionName "1.0.0"
}
//app1产品,注意(这边的产品名字字母不能大写)
A{
dimension "app"
applicationId "com.wmj.a"
versionCode 1
versionName "1.0.0"
}
//线上环境
product{
dimension "dev"
}
//测试环境
zeotest{
dimension "dev"
}
//预发环境
yufa{
dimension "dev"
}
}
构建变体:[product, zeotest, yufa][B, A][Debug, Release] 到时这样组合就可以构建12个变体
1.5 子模块也可以采用productFlavors模式
目前我们app是采用主工程依赖子模块的架构,一旦与另一个app融合的话,那子模块肯定也是有差异化的东西,所以子模块也是需要支持productFlavors模式,不同gradle的版本有不同的配置:
1.gradle 2.xx的版本
- 子模块使用productFlavors时必须加上publishNonDefault true属性
- 主app依赖子模块的时候,由于需要使用到“组合多个产品风味”特点,build.gradle下写的依赖配置需要写很多代码,如下:
configurations {
yufaBReleaseCompile
yufaAReleaseCompile
yufaBDebugCompile
yufaADebugCompile
zeotestBReleaseCompile
zeotestAReleaseCompile
zeotestBDebugCompile
zeotestADebugCompile
productBReleaseCompile
productAReleaseCompile
productBDebugCompile
productADebugCompile
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
yufaAReleaseCompile project(path: ':One', configuration: 'ARelease')
yufaADebugCompile project(path: ':One', configuration: 'ADebug')
yufaBReleaseCompile project(path: ':One', configuration: 'BRelease')
yufaBDebugCompile project(path: ':One', configuration: 'BDebug')
zeotestAReleaseCompile project(path: ':One', configuration: 'ARelease')
zeotestADebugCompile project(path: ':One', configuration: 'ADebug')
zeotestBReleaseCompile project(path: ':One', configuration: 'BRelease')
zeotestBDebugCompile project(path: ':One', configuration: 'BDebug')
productAReleaseCompile project(path: ':One', configuration: 'ARelease')
productADebugCompile project(path: ':One', configuration: 'ADebug')
productBReleaseCompile project(path: ':One', configuration: 'BRelease')
productBDebugCompile project(path: ':One', configuration: 'BDebug')
}
这样之后在BuildVariants下面才有不同的构建变体
2.gradle 3.xx版本
- 子模块只需要如下配置:
flavorDimensions "app"
productFlavors{
B{
dimension "app"
}
A{
dimension "app"
}
}
- 然后主app依赖只需要 implementation project(":One")一句话就搞定依赖