# 源組件和依賴
與 *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