6.4 Sourcesets和依赖
类似 Build Types , Product Flavors 也可以通过他们自己的 sourceSets 控制代码和资源。
上面的例子会创建4个 sourceSets :
- android.sourceSets.flavor1 ,位置是src/flavor1/
- android.sourceSets.flavor2 ,位置是src/flavor2/
- android.sourceSets.androidTestFlavor1 ,位置是src/androidTestFlavor1/
- android.sourceSets.androidTestFlavor2 ,位置是src/androidTestFlavor2/
这些 sourceSets 和 android.sourceSets.main 以及 Build Type sourceSet 一起构建APK。
当处理所有的 sourcesets 以构建一个单独的APK的时候,下面的规则会被应用:
- 所有的源代码(src/*/java)会以多文件夹的方式一起被使用生成一个输出。
- 所有Manifest文件会合并成一个 manifest 文件。这允许 Product Flavors 有一些不同的组件定义或者权限声明,类似于 Build Types 。
- 所有的资源( Android res 和 assets )都会遵循优先级覆盖的原则, Build Type 会覆盖 Product Flavorg ,最后又都会覆盖 main sourceSet .
- 每一个 Build Variant 会基于资源生成他们自己的R类(或者生成其他的源代码),variant之间不会共享。
最后,像 Build Types, Product Flavors 也可以有他们自己的依赖。比如,如果 flavor 用来生成一个广告 ap 和一个付费的 app,其中一个 flavor 可能需要依赖一个广告 SDK,另外一个则不需要。
dependencies {
flavor1Compile "..."
}
在这种特定的情况下,src/flavor1/AndroidManifest.xml
文件可能需要包含访问网络的权限声明。
此外,也会为每一个 variant 创建一个 sourcesets:
- android.sourceSets.flavor1Debug ,位置是src/flavor1Debug/
- android.sourceSets.flavor1Release ,位置是src/flavor1Release/
- android.sourceSets.flavor2Debug ,位置是src/flavor2Debug/
- android.sourceSets.flavor2Release ,位置是src/flavor2Release/
这些 sourcesets 拥有比 build type 更高的优先级,并且允许在 variant 级别上做一些定制。