Android gradle运行时,执行不同的代码,区分不同的productFlavors,加载不同的插件。
在我的项目里面因为使用到不同厂商平台的推送。不同的厂商api需要我们插入的代码是不一致的。
比如google的fcm推送,要求我们加入这个配置
apply plugin: 'com.google.gms.google-services'
华为推送,要求我们加入这个配置
apply plugin: 'com.huawei.agconnect'
现在的项目要求编译一个国际版本和国内版本。大家都知道国内版本是不能使用到fcm的推送的。所以我们要求需要在编译国内版本的时候把fcm给屏蔽掉。同时在编译国际版本的时候也不需要把国内的厂商通道。实现在同一套代码上实现,并且在打包的时候,不需要手动去修改任何代码。
下面是我配置的productFlavors,一个国内版,一个国际版
productFlavors {
china {}
google {}
//先获取到当前编译的flavor,然后根据flavor判断需要执行哪一些
def flavor = getCurrentFlavor()
println("getCurrentFlavor = " + flavor)
if (flavor == "google") {
apply plugin: 'com.google.gms.google-services'
} else {
apply plugin: 'com.huawei.agconnect'
}
}
获取当前编译的Flavor
//需要导入这两个java包
import java.util.regex.Matcher
import java.util.regex.Pattern
/**
* 获取当前编译的Flavor
* @return
*/
def getCurrentFlavor() {
Gradle gradle = getGradle()
String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
Pattern pattern;
if (tskReqStr.contains("assemble"))
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
else
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
Matcher matcher = pattern.matcher(tskReqStr)
if (matcher.find())
return matcher.group(1).toLowerCase()
else {
println "NO MATCH FOUND"
return ""
}
}
在执行getCurrentFlavor方法之后,得到当前编译的flavor,然后根据flavor值进行判断执行不同加载依赖。注意的是在你修改完gradle的代码时,你点击sync now是无法获取到flavor的,你看到的log将会是空的,只有你调用Make Project或者Run或者build的时候,才能获取到flavor的值
gradle println输出的值,可以在build窗口查看。
网友评论