参考:
首先感谢 GitLqr 大佬的无私分享,Gradle多渠道写的很详细。我这里取用一小点。
gradle 提供了 productFlavors 来实现不同的渠道。
不同的渠道引入不同的引用也很简单,可以每个渠道分开指定需要引用的库。
但是如果有几十个渠道,其中一个要引用不同的库。不能因此写几十遍引用,这样后期改动也很麻烦,所以要通过配置来实现。
首先假定有这些渠道
productFlavors {
channel1 {}
channel2 {}
channel3 {}
channel4 {}
channel5 {}
// ... channel xxx 假定非常多
}
那么,可以通过以下代码来对不同的渠道引入不同的内容:
此时 channel1 是直接将远程库加入包,其他渠道是不打入的。
注意:示例代码是 library,所以用的libraryVariants 。如果是apk,需要改成 applicationVariants
dependencies {
def aar1='com.xxx.xxx:aaaa:1.0.0-SNAPSHOT'
def aar2='com.xxx.xxx:bbbb:1.0.0-SNAPSHOT'
android.libraryVariants.all { variant ->
variant.productFlavors.each { flavors ->
// println(flavors.name)
if (flavors.name.equals("channel1")) {
dependencies.add("${variant.flavorName}Embed", aar1)
dependencies.add("${variant.flavorName}Embed", aar2)
} else {
dependencies.add("${variant.flavorName}CompileOnly", aar1)
dependencies.add("${variant.flavorName}CompileOnly", aar2)
}
// 示例
// 本地引用1
// dependencies.add("${variant.flavorName}Implementation", project(':DroidPluginFix'))
// 本地引用2
// dependencies.add("${variant.flavorName}Implementation", fileTree(include: ['*.aar'], dir: 'libs_xxx_1'))
// 远程引用1
// dependencies.add("${variant.flavorName}Implementation", 'com.xxx.xxx:aaaa:1.0.0-SNAPSHOT')
// 远程引用2
// dependencies.add("${variant.flavorName}Embed", 'com.xxx.xxx:aaaa:1.0.0-SNAPSHOT')
// 远程引用3
// dependencies.add("${variant.flavorName}CompileOnly", 'com.xxx.xxx:bbbb:1.0.0-SNAPSHOT@aar')
}
}
// others xxx
}
还有个方法写起来更简单,但是不完美:
dependencies {
gradle.startParameter.getTaskNames().each { task ->
// printf("====================================================")
// println("print task : " + task)
if (task.contains('Channel1')) {
embed ('com.xxx.aaa:asd:1.0.0')
} else {
compileOnly ('com.xxx.bbb:asd:1.0.0')
}
}
// others xxx
}
这个是通过 task 来进行区分:
打单个渠道时是没有问题的:gradle clean assembleChannel1 / assembleChannel2 这时候能够区分出 Channel1 。
但是如果你想打所有渠道,使用类似 gradle clean assebmleRelease
这时候task 就是 clean 和 assembleRelease ,就无法触发if 了。所以这个方法不完美。