Android Gradle 插件中文指南

6.4 Sourcesets和依赖

类似 Build TypesProduct Flavors 也可以通过他们自己的 sourceSets 控制代码和资源。

上面的例子会创建4个 sourceSets

  • android.sourceSets.flavor1 ,位置是src/flavor1/
  • android.sourceSets.flavor2 ,位置是src/flavor2/
  • android.sourceSets.androidTestFlavor1 ,位置是src/androidTestFlavor1/
  • android.sourceSets.androidTestFlavor2 ,位置是src/androidTestFlavor2/

这些 sourceSetsandroid.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 级别上做一些定制。