# 多定制的变种版本
某些情况下,应用可能需要基于多个标准来创建多个版本。
例如,Google Play 中的 multi-apk 支持 4 种过滤器。根据每个过滤器来创建不同的 APK 需要使用 *Product Flavor* 分组。
假如有个游戏有免费版和付费版,并且需要在 multi-apk 支持中使用 ABI 过滤器(译注:ABI,应用二进制接口,优点是不需要改动应用的任何代码就能够将应用迁移到任何支持相同 ABI 的平台上)。该游戏应用需要 3 个 ABI 和两个特定版本,因此就需要生成 6 个 APK(忽略不同 *Build Types* 生成的 variant 版本)。
然而,3 个 ABI 付费版的源代码都是相同的,因此创建 6 个 flavor 来实现并不是一个好办法。
相反的,可以使用两个 flavor 分组,并且让它自动构建所有可能的 variant 组合。
对应的功能实现需要使用 Flavor Dimensions(译注:`Flavor Dimensions` 对应旧版中的 `Flavor Groups`),并将 flavor 分配到一个指定的 Group 中。
~~~
android {
...
flavorDimensions "abi", "version"
productFlavors {
freeapp {
flavorDimension "version"
...
}
x86 {
flavorDimension "abi"
...
}
}
}
~~~
**andorid.flavorDimensions** 数组按照先后排序定义了可能用到的分组。(示例中)每个 *Product Flavor* 都被分配到一个分组中。
示例中将 *Product Flavor* 分为两组,为别为 abi [x86,arm,mips] 和 version [freeapp,paidapp],再加上默认的 *Build Type* [debug,release],最后会生成以下的 Build Variant:
- `x86-freeapp-debug`
- `x86-freeapp-release`
- `arm-freeapp-debug`
- `arm-freeapp-release`
- `mips-freeapp-debug`
- `mips-freeapp-release`
- `x86-paidapp-debug`
- `x86-paidapp-release`
- `arm-paidapp-debug`
- `arm-paidapp-release`
- `mips-paidapp-debug`
- `mips-paidapp-release`
**andorid.flavorDimensions** 中元素的顺序非常重要(variant 命名和优先级等)。
每个 variant 版本的配置由几个 *Product Flavor* 对象决定:
- **android.defaultConfig**
- 一个来自 abi 组中的对象
- 一个来自 version 组中的对象
flavorDimensions 中的顺序决定了 flavor 的优先级,这对于资源来说非常重要,因为 flavor 中的值会替换定义在低优先级的 flavor 中的值。
flavor dimensions 使用最高的优先级定义,因此前面例子中的优先级为:
~~~
abi > version > defaultConfig
~~~
Multi-flavors 项目同样拥有额外的 sourceSet,类似于 variant 的 sourceSet,只是少了 Build Type:
- **android.sourceSets.x86Freeapp**位于 `src/x86Freeapp/`
- **android.sourceSets.armPaidapp**位于 `src/armPaidapp/`
- 等等...
这允许在 flavor-combination(组合 flavor)的层次上进行定制。它们拥有比最基本的 flavor 的 sourceSet 更高的优先级,但是优先级低于 Build Type 的 sourceSet。
- 译者序
- 简介
- 新构建系统的目标
- 为什么使用 Gradle?
- 配置要求
- 基础项目
- 构建文件示例
- 项目结构
- 配置项目结构
- 构建任务
- 通用任务
- Java 项目的 Task
- Android Tasks
- 基本的构建定制
- Manifest 属性
- 构建类型
- 签名配置
- 运行 ProGuard
- 清理资源
- 依赖、Library 和多项目
- 包依赖
- 本地包依赖
- 远程包依赖
- 多项目设置
- Library 项目
- 创建 Library 项目
- 普通项目和 Library 项目的区别
- 引用 Library 项目
- Library 项目发布
- 测试
- 单元测试
- 基本知识和配置
- 运行测试
- 测试 Android Library 项目
- 测试报告
- 独立项目
- 多项目报告
- Lint 支持
- 构建 Variants(变种)版本
- 产品定制
- 构建类型+产品定制=构建变种版本
- 产品定制的配置
- 源组件和依赖
- 构建和任务
- 测试
- 多定制的变种版本
- 高级构建的自定义
- 构建选项
- Java 编译选项
- aapt 选项
- dex 选项
- 操作 task
- 构建类型和产物定制的属性引用
- 使用sourceCompatibility 1.7
- 附录
- ApplicationId 与 packageName