productFlavors的高级用法

Android gradle的功能非常强大,其中有一项productFlavors, 顾名而思义,就是用于定义产品的特性,这是每个产品不同的地方。有了它我们可以用同一套代码创建不同的产品。我们这篇文章不具体介绍它的详细用法,而只是介绍一个我实际工作中用到的一项比较复杂的用法。

简介

Android gradle的功能非常强大,其中有一项productFlavors, 顾名而思义,就是用于定义产品的特性,这是每个产品不同的地方。有了它我们可以用同一套代码创建不同的产品。我们这篇文章不具体介绍它的详细用法,而只是介绍一个我实际工作中用到的一项比较复杂的用法。它的一般用法可以自己百度或gg,快速链接参考一下

问题背景

我们公司的工程比较复杂,有一个App module(主module),多个业务module,一堆lib module。现在假如App module是App.module,有一个业务module叫login.module,还有一个lib module叫lib.module。lib module由于产品的需求,有部分异同,需要使用productFlavors来打包成多个输出包。如下所示

productFlavors {
    dev {
        buildConfigField("String", "env", properties.getProperty("env"))
    }
    rel {
        buildConfigField("String", "env", properties.getProperty("env"))
    }
}

问题来了, 我上层的login.module依赖lib.module如何写呢?

配置方式

lib.module中需要配置productFlavors

publishNonDefault true //注意,这里的配置是为了去除gradle对library module默认只编译release buildType的限制
 productFlavors {
        dev {
            buildConfigField("String", "env", properties.getProperty("env"))
        }

        rel {
            buildConfigField("String", "env", properties.getProperty("env"))
        }
    }

App.module中需要在dependencies中增加compile支持

devCompile project(path: ':lib.module', configuration: 'devRelease')
relCompile project(path: ':lib.module', configuration: 'relRelease')

这样就已经可以实现问题背景中描述的需求,实现lib.module的productFlavors跟随App.module中productFlavors动态保持一致(可以通过在studio中配置不同的Build Variants来测试效果)。其实不管是Application module,还是一个library module,只要需要依赖lib.module,都需要在自身的build.gradle中配置同样的productFlavors。

扩展知识

  • publishNonDefault true //去除gradle对library module默认只编译release buildType的限制
  • defaultPublishConfig “devDebug” // 指定默认编译的variant (flavor+buildType)

参考链接

文章目录
  1. 1. 简介
  2. 2. 问题背景
  3. 3. 配置方式
  4. 4. 扩展知识
  5. 5. 参考链接