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中的颜色设置
  2. android 4中新增的日历处理相关API
  3. Android(安卓)关于动画设置问题。
  4. 安卓开发38:安卓的滚动条相关属性
  5. Android(安卓)SystemProperties 系统属性分析
  6. Android(安卓)layout xml总结
  7. android 设置横屏竖屏
  8. android菜鸟学习笔记12----Android控件(一) 几个常用的简单控件
  9. [置顶] 自定义的解压进度条 关于ProgressBar的使用

随机推荐

  1. Android安装和删除(卸载)应用软件程序(ap
  2. Android(安卓)Market google play store
  3. android中使用别人的UI框架
  4. 第11天android:拨号器和打包发布
  5. Linux安装Android(安卓)SDK时出现Failed
  6. 在Android上执行Java程序
  7. android 电容屏(一):电容屏基本原理篇
  8. android发生主机无法解析错误的问题(
  9. android中自定义播放器的实现
  10. Ted Mosby - 一个MVP框架的软件架构