# 源组件和依赖
与 *Build Type* 类似,*Product Flavor* 也会通过它们自己的 *sourceSet* 提供代码和资源。
上面的例子将会创建4个 *sourceSet*:
- **android.sourceSets.flavor1**位于 `src/flavor1/`
- **android.sourceSets.flavor2**位于 `src/flavor2/`
- **android.sourceSets.androidTestFlavor1**位于 `src/androidTestFlavor1/`
- **android.sourceSets.androidTestFlavor2**位于 `src/androidTestFlavor2/`
这些 *sourceSet* 用于与 **android.sourceSets.main** 和 *Build Type* 的 *sourceSet* 来构建 APK。
下面的规则用于处理所有的 sourceSet 来构建一个 APK:
- 多个文件夹中的所有的源代码(`src/*/java`)都会合并起来生成一个输出。
- 所有的 Manifest 文件都会合并成一个 Manifest 文件。类似于 *Build Type*,允许 *Product Flavor* 可以拥有不同的的组件和权限声明。
- 所有使用的资源(Android res 和 assets)遵循的优先级为 *Build Type* 会覆盖 *Product Flavor*,最终覆盖 **main***sourceSet* 的资源。
- 每一个 *Build Variant* 都会根据资源生成自己的 R 类(或者其它一些源代码)。Variant 互相之间没有什么是共享的。
最终,类似 *Build Type*,*Product Flavor* 也可以有它们自己的依赖关系。例如,如果使用 flavor 来生成一个基于广告的应用版本和一个付费的应用版本,其中广告版本可能需要依赖于广告 SDK,但是付费版不需要。
~~~
dependencies {
flavor1Compile "..."
}
~~~
在这个例子中,`src/flavor1/AndroidManifest.xml` 文件中可能需要声明访问网络的权限。
每一个 Variant 也会创建额外的 sourceSet:
- **android.sourceSets.flavor1Debug**位于 `src/flavor1Debug/`
- **android.sourceSets.flavor1Release**位于 `src/flavor1Release/`
- **android.sourceSets.flavor2Debug**位于 `src/flavor2Debug/`
- **android.sourceSets.flavor2Release**位于 `src/flavor2Release/`
这些 sourceSet 拥有比 Build Type 的 sourceSet 更高的优先级,并允许在 Variant 的层次上做一些定制。
- 译者序
- 简介
- 新构建系统的目标
- 为什么使用 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