Android gradle运行时,执行不同的代码

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窗口查看。

如下图,我选择编译国内版本的时候输出 log和加载的依赖。
Android gradle运行时,执行不同的代码_第1张图片
image.png

你可能感兴趣的:(Android gradle运行时,执行不同的代码)