Android Gradle之productFlavors(定制产品)

productFlavors

Build Type + Product Flavor = Build Variant

每一个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。

Sourcesets and Dependencies

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

创建一个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。

你可能感兴趣的:(ANDROID)