android:app1和app2代碼融合方案
前言:因?yàn)閮蓚€(gè)app主工程都需要共用趴酣,只是存在不同差異的界面和資源圖片顯示等情況,因此android這邊可以采用gradle自帶的productFlavors工具來(lái)實(shí)現(xiàn)多渠道瓦呼,多app打包方式進(jìn)行。
1. productFlavors用處
* 創(chuàng)建不同的產(chǎn)品
* 創(chuàng)建不同的產(chǎn)品并為不同產(chǎn)品分配專有屬性
* 設(shè)置不同代碼引用
* 先在src目錄下簡(jiǎn)歷對(duì)應(yīng)的文件夾比如java代碼則建立productjavares文件夾則建立productres
* 建立包名建立Java類文件
* 在app-level下的gradle文件中設(shè)置sourceSets
* 設(shè)置不同的產(chǎn)品引入不同的包
1.1 創(chuàng)建不同的產(chǎn)品風(fēng)味测暗,并為不同產(chǎn)品分配專有屬性
在app:級(jí)別下的gradle文件中央串,加入productFlavors,并在productFlavors下創(chuàng)建產(chǎn)品A與B
productFlavors {
//新建產(chǎn)品A
A {
//程序包名
applicationId "com.wmj.a"
//不同渠道號(hào)
manifestPlaceholders = [UMC:"product-Complete"]
//versionName
versionName "1.0.0"
//versionCode
versionCode 1
}
//新建產(chǎn)品B
B {
//程序包名
applicationId "com.wmj.b"
//不同渠道號(hào)
manifestPlaceholders = [UMC:"product-Temp"]
//versionName
versionName "2.1.1"
//versionCode
versionCode 2
}
1.2 設(shè)置不同代碼資源等引用
如果項(xiàng)目中對(duì)不同產(chǎn)品區(qū)分不同的代碼,比如服務(wù)器地址的區(qū)分碗啄,或者某些其他常量的區(qū)分,或者資源质和,布局頁(yè)面都是可以區(qū)分的
先在src目錄下簡(jiǎn)歷對(duì)應(yīng)的文件夾,比如java代碼則建立稚字,product/java,res文件夾則建立product/res
1.3 還可以設(shè)置不同的產(chǎn)品引入不同的包
使用方式:產(chǎn)品名Compile “xxx.xxx.xx”
//不同產(chǎn)品引入不同的包
ACompile "com.android.support:appcompat-v7:26.+"
BCompile "com.android.support.constraint:constraint-layout:1.0.2"
1.4 組合多個(gè)產(chǎn)品風(fēng)味
某些情況下饲宿,您可能希望組合多個(gè)產(chǎn)品風(fēng)味中的配置厦酬。比如像我們app之前就有test環(huán)境、預(yù)發(fā)環(huán)境瘫想、線上環(huán)境弃锐,如今又有分app1和app2,那你肯定希望能組合它們殿托,比如組合之后有“app1測(cè)試環(huán)境debug”、“app1預(yù)發(fā)環(huán)境debug”剧蚣、“app2預(yù)發(fā)環(huán)境debug”支竹、“app1預(yù)發(fā)環(huán)境release”、“app2預(yù)發(fā)環(huán)境release”等等組合鸠按,為此礼搁,您可以通過適用于 Gradle 的 Android 插件創(chuàng)建產(chǎn)品風(fēng)味組,稱為風(fēng)味維度目尖。構(gòu)建您的應(yīng)用時(shí)馒吴,Gradle 會(huì)將您定義的每個(gè)風(fēng)味維度中的產(chǎn)品風(fēng)味配置與構(gòu)建類型配置組合來(lái)創(chuàng)建最終構(gòu)建變體。Gradle 不會(huì)組合屬于相同風(fēng)味維度的產(chǎn)品風(fēng)味瑟曲。如下列子說明:
//使用flavorDimensions屬性來(lái)創(chuàng)建一個(gè)“模式”風(fēng)味維度饮戳,維度來(lái)區(qū)分不同的類型,然后兩個(gè)類型之間組合
//“dev”指的是編譯出來(lái)是什么環(huán)境的apk
//“app”指的是app1和app2
flavorDimensions "dev","app"
flavorDimensions "dev","app"
productFlavors{
//app2產(chǎn)品,注意(這邊的產(chǎn)品名字字母不能大寫)
B{
dimension "app"
applicationIdSuffix "com.wmj.b"
versionCode 1
versionName "1.0.0"
}
//app1產(chǎn)品,注意(這邊的產(chǎn)品名字字母不能大寫)
A{
dimension "app"
applicationId "com.wmj.a"
versionCode 1
versionName "1.0.0"
}
//線上環(huán)境
product{
dimension "dev"
}
//測(cè)試環(huán)境
zeotest{
dimension "dev"
}
//預(yù)發(fā)環(huán)境
yufa{
dimension "dev"
}
}
構(gòu)建變體:[product, zeotest, yufa][B, A][Debug, Release] 到時(shí)這樣組合就可以構(gòu)建12個(gè)變體
1.5 子模塊也可以采用productFlavors模式
目前我們app是采用主工程依賴子模塊的架構(gòu)洞拨,一旦與另一個(gè)app融合的話扯罐,那子模塊肯定也是有差異化的東西,所以子模塊也是需要支持productFlavors模式烦衣,不同gradle的版本有不同的配置:
1.gradle 2.xx的版本
- 子模塊使用productFlavors時(shí)必須加上publishNonDefault true屬性
- 主app依賴子模塊的時(shí)候歹河,由于需要使用到“組合多個(gè)產(chǎn)品風(fēng)味”特點(diǎn),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下面才有不同的構(gòu)建變體
2.gradle 3.xx版本
- 子模塊只需要如下配置:
flavorDimensions "app"
productFlavors{
B{
dimension "app"
}
A{
dimension "app"
}
}
- 然后主app依賴只需要 implementation project(":One")一句話就搞定依賴