每一个Build Type都会生成一个新的APK。
Product Flavor同样也会做这些事情:项目的输出将会拼接所有可能的Build Type和Product Flavor(如果有Flavor定义存在的话)的组合。
例如:
android {
....
productFlavors {
flavor1 {
...
}
flavor2 {
...
}
}
}
上面两个flavor与默认的debug和release两个Build Type将会生成4个Build Variant:
- Flavor1 - debug
- Flavor1 - release
- Flavor2 - debug
- Flavor2 - release
1、注意ProductFlavor类型的android.productFlavors.*对象与android.defaultConfig对象的类型是相同的。这意味着它们共享相同的属性。
defaultConfig为所有的flavor提供基本的配置,每一个flavor都可以重设这些配置的值。
2、通常情况下,Build Type的配置会覆盖其它的配置。例如,Build Type的packageNameSuffix会被追加到Product Flavor的packageName上面。
但是,我们更常用的是Flavor中的applicationIdSuffix,将追加到applicationId上,以便实现可在同一手机上安装调试、发布等多个App。
3、也有一些情况是一些设置可以同时在Build Type和Product Flavor中设置。在这种情况下,按照个别为主的原则决定。
例如,signingConfig就这种属性的一个例子。 signingConfig允许通过设置android.buildTypes.release.signingConfig来为所有的release包共享相同的SigningConfig。也可以通过设置android.productFlavors.*.signingConfig来为每一个release包指定它们自己的SigningConfig。
1、与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/
2、类似Build Type,Product Flavor也可以有它们自己的依赖关系。例如,如果使用flavor来生成一个基于广告的应用版本和一个付费的应用版本,其中广告版本可能需要依赖于一个广告SDK,但是另一个不需要。
dependencies {
flavor1Compile "..."
}
在这个例子中,src/flavor1/AndroidManifest.xml文件中可能需要声明访问网络的权限。
3、Flavor的sourceSet拥有比Build Type的sourceSet更高的优先级!!!
创建一个productFlavors跟创建一个buildType类似:在productFlavors代码块中添加一条并包含一些响应的设置即可。
productFlavors支持跟defaultConfig中同样的属性,这是因为defaultConfig实际上归属于productFlavor类。
Google文档中ProductFlavor类
这就意味着我们可以在defaultConfig中针对所有flavors做一些基本的配置,同时,每个flavor可以更改任意一个默认属性值,比如applicationId。
注意:我们仍然需要在main/ manifest文件中的package属性指定包名。我们必须使用包名来对照R类、注册activity或者service。这就保证了我们可以用applicaitonId为每一个product flavors提供一个唯一的ID,用来打包发布,而不用更改源码。
所有flavor都必须从属于一个已命名的dimension,dimension是一个flavors的群组。即便是只有一个flavor也要指定dimension,否则回报错:
Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.
flavor dimension有什么用呢?
在同一dimension分组下的flavor不会被合并。比如app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk
另外,构架基于不同ABI和屏幕分辨率版本的APK时,建议使用build Multiple APKs而不是用product flavors。