一、背景

每种产品变种都代表您可以构建的一个不同的应用版本。例如,您可能希望为应用构建两个版本,一个是内容有限的免费版本,另一个是包含更多内容的付费版本。您还可以根据 API 级别或其他设备变化因素,为应用构建以不同设备为目标的不同版本。

二、配置产品变种

将其添加到构建配置中的 productFlavors 代码块并添加所需的设置。产品变种支持与 defaultConfig 相同的属性,这是因为,defaultConfig 实际上属于 ProductFlavor 类。这意味着,您可以在 defaultConfig 代码块中提供所有变种的基本配置,每个变种均可更改其中任何默认值,如 applicationId。

所有变种都必须属于一个指定的变种维度,即一个产品变种组。您必须将所有变种分配给某个变种维度;否则,您将收到如下所示的构建错误。如果给定的模块仅指定一个变种维度,那么 Android Gradle 插件会自动将该模块的所有变种分配给该维度。

Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.

以下代码示例创建了一个名为“version”的变种维度,并添加了“demo”和“full”产品变种。这些变种提供了它们自己的 applicationIdSuffix 和 versionNameSuffix:

android {...defaultConfig {...}buildTypes {debug{...}release{...}}// Specifies one flavor dimension.flavorDimensions "version"productFlavors {demo {// Assigns this product flavor to the "version" flavor dimension.// If you are using only one dimension, this property is optional,// and the plugin automatically assigns all the module's flavors to// that dimension.dimension "version"applicationIdSuffix ".demo"versionNameSuffix "-demo"}full {dimension "version"applicationIdSuffix ".full"versionNameSuffix "-full"}}
}

创建并配置产品变种后,点击通知栏中的 Sync Now。同步完成后,Gradle 会根据 build 类型和产品变种自动创建 build 变体,并按照 为其命名。例如,如果您创建了“demo”和“full”产品变种,并保留了默认的“debug”和“release”build 类型,则 Gradle 会创建以下 build 变体:

  • demoDebug
  • demoRelease
  • fullDebug
  • fullRelease

三、flavor资源合并规则

变体的资源合并功能简直是"神器"一般的存在,可以解决很多业务需求,如不同渠道显示的icon不同,应用名不同等等。Android Studio在对变体目录和main目录进行资源合并时,会遵守这样的规则,假设当前选中的变体是demoDebug:

  • 某资源在demo下有,在main中没有,那么在打包时,会将该资源直接合并到main资源中。
  • 某资源在demo下有,在main中也有,那么在打包时,会以demo为主,将demo中资源替换掉main中资源。

除了字符串合并外,还有图片(drawable、mipmap)、布局(layout)、清单文件(AndroidManifest.xml)的合并,具体可以自己尝试一下。其中,清单文件的合并需要提醒一点,如果渠道目录下的AndroidManifest.xml与main下的AndroidManifest.xml拥有相同的节点属性,但属性值不同时,那么就需要对main下的AndroidManifest.xml进行修改了,具体修改要根据编译时报错来处理,所以,报错时不要慌,根据错误提示修改就是了。

注意:布局(layout)文件的合并是对整个文件进行替换的~。

四、代码合并

代码文件,顾名思义就是指java目录下的.java文件了,为什么代码叫整合,而资源却是合并呢?因为代码文件是没办法合并的,只能是整合,整合是什么意思?假设当前选中的变体是demoDebug,有一个java文件是Test.java,这个Test.java要么只存在demo/java下,要么只存在于main/java下。

五、flavor多module常见问题

1、在app和它的module中都有同一个维度(比如:flavorDimensions ‘tier’),但你的app有的flavors在module中没有

flavorDimensions 'tier'
productFlavors {paid {// 因为依赖app的module在'tier'维度下也有'paid'这个flavor,所以你不用去管,// gradle会自动为你匹配dimension 'tier'}free {// 因为module在'tier'维度下没有'free'这个flavor,所以需要指定matchingFallbacks// 让gradle知道怎么去匹配// 像下面这样配置,gradle会按顺序依次去匹配module中'tier'维度下的flavor,// 直到匹配到,否则会报错matchingFallbacks = ['demo', 'trial']}
}

注意:对于在同一个维度下,module中有的flavors但app中没有是不会报错的,因为gradle插件根本不会去module中请求flavors。

2、module中有某个dimension维度,但app中没有

// In the app's build.gradle file.
android {defaultConfig{// 下面这句话告诉gradle,当遇到一个module中有个app中没有的'minApi'维度时,// 它应该按照下面这个顺序去匹配这个维度的flavorsmissingDimensionStrategy 'minApi', 'minApi18', 'minApi23'// 若其他module中还有更多app中没有的维度,你必须为所有的维度定义回退策略missingDimensionStrategy 'abi', 'x86', 'arm64'}flavorDimensions 'tier'productFlavors {free {dimension 'tier'// 你可以在一个特定的flavor中覆盖defaultConfig的配置missingDimensionStrategy 'minApi', 'minApi23', 'minApi18'}paid { }}
}

3、排除掉某些不需要的变体

variantFilter { variant ->def names = variant.flavors*.namedef types = variant.buildType.nameif (names.contains("abi") && types == "debug") {// Gradle ignores any variants that satisfy the conditions above.setIgnore(true)}
}

Android 产品变种相关推荐

  1. iphone和android,iPhone 和 Android 产品经理有哪些异同?

    牛比立体@知乎的回答: 相同点: 1.都以为自己了解用户 2.都以为自己了解手机 3.都认为自己的方向有前途 4.都用iPhone手机 5.都不用自己的产品 6.都是SB+苦B 不同点: 1.iPho ...

  2. android产品设计,Android产品设计

    Android产品设计,我们深信,凝聚一群人,用心在一件事上,为客户创造价值,它必将赢得客户的足够尊重和信赖. Android产品设计, 随着Android平台的扩张,引发了Android人才荒,20 ...

  3. [转]Android产品研发(十九)

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了webview中问题集锦,讲解了webview的性能优化.webview种入Cookie信息.activity退出的时候清除webview信息报错 ...

  4. Android产品研发(二十一)--Android中的UI优化

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android产品研发过程中的代码Review.通过代码Review能够提高产品质量,增强团队成员之间的沟通,提高开发效率,所以良好的产品开发迭代 ...

  5. 论Android产品高效开发之路

    文/姚冬 通过对Android产业开发的简要分析,总结了Android系统开发中遇到的各种问题,从产品组合.需求管理.建模与重用.协同开发等角度分析和总结出能够加速Android系统开发并有效提高产品 ...

  6. Android产品研发(十)--尽量不使用静态变量保存数据

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了Android开发过程中几种常见网络协议:xml,json,protobuf等,以及它们各自的优缺点,一般而言当我们的App涉及到了网络传输时都会 ...

  7. Android产品研发(五)--多渠道打包

    转载请标明出处:一片枫叶的专栏 国内的Android开发者还是很苦逼的,由于众所周知的原因,google play无法在国内打开(翻墙的就不在考虑之内了),所以Android系的应用市场,群雄争霸.后 ...

  8. Android产品定制多语言

    Android产品定制多语言 android产品支持的多语言非常丰富,在很多市场上销售的android产品的语言列表很长很长.在国内,一般都默认中文,还有许多其他语言,有事列表太长了,一旦客户在前面点 ...

  9. Android产品研发(二十)--代码Review

    转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了如何在Android studio中进行单元测试.实际开发过程中有一些功能性的需求,比如测试工具类,测试数据存储等测试工作,如果还是通过重复执行a ...

最新文章

  1. 1091 Acute Stroke 需再做
  2. Protobuf的优点
  3. db2 快速清除表中所以的数据
  4. Mapreduce概念及流程介绍
  5. 建筑业建筑业大数据行业现状_建筑—第4部分
  6. Raw Socket(原始套接字)实现Sniffer(嗅探)
  7. 行测中图形推理题的规律
  8. OBV指标交易策略(累积能量潮与移动能量潮,成交量多空比率净额及相关应用原则)
  9. 漫画聚合阅读器Tachidesk
  10. 相关系数、相关指数和回归系数等概念含义
  11. SpringCloudStream基础
  12. DTPA PEG 异硫氰酸荧光素,DTPA PEG FITC,FITC-PEG-DTPA
  13. 使用火焰图(FlameGraph)分析程序性能
  14. Java尚硅谷基础笔记-day4数组-数组常见算法
  15. 测试ocx(MFC ActiveX控件)
  16. XGboost如何调用保存好的模型
  17. 1 核 2G 服务器安装 gitlab-ce
  18. 【SQL Server学习笔记】4:使用SSMS创建数据库表并完善表结构
  19. 常见主机漏洞及修复方案
  20. Spring Boot 和 PHP选哪个?

热门文章

  1. HAL_UART_Receive_IT()与UART_Receive_IT()
  2. mongodb gridfs java_mongodb Gridfs操作
  3. 存储过程的优缺点个人总结
  4. 如何正确使用redis
  5. 辣条君写爬虫 3【爬取贝克街用户】
  6. 语音输入法出了这么多年我几乎没用过,直到……
  7. 论文R语言复现 | 基于 EM 算法的高斯混合模型参数估计
  8. bzoj 1242 Zju1015 Fishing Net 弦图判定
  9. 网站首页标题设置优化方法
  10. 外链式样式表_html+css外链式