学新通技术网

【Gradle 学习】(七)Android 产品风格 productFlavors 变种版本

juejin 8 1
【Gradle 学习】(七)Android 产品风格 productFlavors 变种版本

productFlavors 产品风格

Android Gradle 提供了productFlavors,让我们可以对生成的 APK 包进行定制。这个 DSL 最常用于多渠道打包。

它支持与 defaultConfig 相同的属性,这是因为,defaultConfig 实际上属于 ProductFlavor。

创建 prodectFlavor

自定义一个 productFlavor 也是和 buildType 一样:名称{}

android  {
    productFlavors {
        dev{
​
        }
        google{
​
        }
        baidu{
​
        }
    }
}

这样当我们运行 assembleRelease 的时候就会生成 3 个 release 包,分别是 dev、google 以及 baidu。目前看这三个包除了文件名没有什么不一样,此时还没有定制,使用的都是 defaultConfig 配置。这里的 flavor 和 defaultConfig 是一样的,可以自定义其 applicationId、versionCode 以及 versionName等信息,比如区分不同包名:

android  {
    defaultConfig{
        ……
        // Specifies a flavor dimension.
        flavorDimensions "channel"
    }
    productFlavors {
        dev{
            applicationId "cn.tina.demo.dev"
        }
        google{
            applicationId "cn.tina.demo.google"
        }
    }
}

同 buildTypes,productFlavors 也有自己代码和资源文件夹,路径为 src/<flavorName+buildTypeName>/

注意:flavor 的命名不能与已存在的 Build Type 或者与 androidTest、test sourceSet 有冲突。

flavorDimensions

flavorDimensions(风格维度),所有风格都必须指定一个风格维度,即一个产品风格组。必须将所有风格分配给某个维度;否则,您将收到如下所示的构建错误。如果给定的模块仅指定一个变种维度,则 Android Gradle 插件会自动将该模块的所有变种分配给该维度。

 Error:All flavors must now belong to a named flavor dimension.
 The flavor 'flavor_name' is not assigned to a flavor dimension.

变种版本

每一个 Build Type 都会生成新的 APK。Product Flavors 同样也会做这些事情:项目的输出将会组合所有的 Build Types 和 Product Flavors(如果有定义 Flavor)。

每一种组合(包含 Build Type 和 Product Flavor)就是一个 Build Variant(构建变种版本)。

例如,在之前的 Flavor 声明例子中与默认的 debug 和 release 两个 Build Types 将会生成 4 个 Build Variants:{dev, google}{debug, release}

  • dev - debug
  • dev - release
  • google - debug
  • google - release

项目中如果没有定义 flavor 同样也会有 Build Variants,只是使用的是 default 的 flavor/config,因为是无名称的,所以生成的 build variant 列表看起来就跟 Build Type 列表一样。

多定制的变种版本

扩展:flavorDimesions 可以设置多个,如

android  {
    defaultConfig{
        ……
        // Specifies a flavor dimension.
        flavorDimensions "channel","production"
    }
    productFlavors {
        dev{
            dimension "channel"
            applicationId "cn.tina.demo.dev"
        }
        google{
            dimension "channel"
            applicationId "cn.tina.demo.google"
        }
        productA{
          dimension "production"  
        }
        productB{
          dimension "production"  
        }
    }
}

那么可以组合出4种(2*2)种产品,分别有 debug 和 release,一共是8个变种版本

构建和任务

我们前面提到每一个 Build Type 会创建自己的 assemble<name> task,但是 Build Variants 是 Build Type 和 Product Flavor 的组合。 当使用 Product Flavor 的时候,将会创建更多的 assemble-type task。分别是:

  • assemble<Variant Name> 允许直接构建一个 variant 版本,例如 assembleDevDebug
  • assemble<Build Type Name> 允许构建指定 Build Type 的所有 APK,例如 assembleDebug 将会构建 DevDebugGoogleDebug 两个 variant 版本。
  • assemble<Product Flavor Name> 允许构建指定 flavor 的所有 APK,例如 assembleDev 将会构建 DevDebugDevRelease 两个 variant 版本。 另外 assemble task 会构建所有的 variant 版本。

代码及资源集合优先级

不论是构建类型还是产品风格都可以创建对应的代合和资源文件。这里有个优先级问题,可以看出 通过 flavor+ BuildType 存在很多组合,不同源集包统一文件的不同版本,Gradle 将按一下顺序决定使用哪一个文件

构建版本(Debug/Release)> 产品风格(google/dev)> 产品变种(googleDebug等)> 主源集(main)

本文出至:学新通技术网

标签: