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。

更多相关文章

  1. android 多版本打包之productFlavors 用法
  2. Android SystemProperties 系统属性分析
  3. android版本更新功能
  4. Android ListView几个比较有用的属性
  5. xml-----属性收集
  6. Android 不同API版本 向后兼容
  7. android获取手机型号和系统版本号
  8. ListView的一些属性

随机推荐

  1. android Glide3.7 圆角图片
  2. Butter Knife 官方文档
  3. android 实现阻尼效果
  4. Android(安卓)自定义 Toast 示例
  5. Dump Window
  6. android 图片下面显示文字
  7. 一个android显示远程txt的代码例子
  8. Android(安卓)GridView+listener
  9. 说说Android桌面(Launcher应用)背后的故
  10. [置顶] Android(安卓)命名规范 (提高代码