Android : 代码多维度管理(产品风味) - flavorDimensions & productFlavors
一、关于配置产品风味
Android studio 升级到3.0之后,gradle增加了多维度管理配置,便于同一个项目中创建应用的不同版本,分别管理依赖项并签署配置。创建产品风味与创建构建类型类似:只需将它们添加到 productFlavors {}
代码块并配置您想要的设置。产品风味支持与 defaultConfig
相同的属性,这是因为 defaultConfig
实际上属于 ProductFlavor
类。这意味着,您可以在 defaultConfig {}
代码块中提供所有风味的基本配置,每种风味均可更改任何这些默认值,例如 applicationId
。当您创建新模块时,Android Studio 会自动为您创建调试和发布这两种构建类型。尽管调试构建类型不会出现在构建配置文件中,Android Studio 会为其配置 debuggable true
。这样,您可以在安全的 Android 设备上调试应用并使用通用调试密钥库配置 APK 签署。官网示例:
android {
...
buildTypes {
debug {...}
release {...}
} // Specifies the flavor dimensions you want to use. The order in which you
// list each dimension determines its priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "api", "mode" productFlavors {
demo {
// Assigns this product flavor to the "mode" flavor dimension.
dimension "mode"
...
} full {
dimension "mode"
...
} // Configurations in the "api" product flavors override those in "mode"
// flavors and the defaultConfig {} block. Gradle determines the priority
// between flavor dimensions based on the order in which they appear next
// to the flavorDimensions property above--the first dimension has a higher
// priority than the second, and so on.
minApi24 {
dimension "api"
minSdkVersion ''
// To ensure the target device receives the version of the app with
// the highest compatible API level, assign version codes in increasing
// value with API level. To learn more about assigning version codes to
// support app updates and uploading to Google Play, read Multiple APK Support
versionCode + android.defaultConfig.versionCode
versionNameSuffix "-minApi24"
...
} minApi23 {
dimension "api"
minSdkVersion ''
versionCode + android.defaultConfig.versionCode
versionNameSuffix "-minApi23"
...
} minApi21 {
dimension "api"
minSdkVersion ''
versionCode + android.defaultConfig.versionCode
versionNameSuffix "-minApi21"
...
}
}
}
...
通过以上配置,就可以编译出多维度apk,以上示例可根据 "api" + "mode" 2个维度分别配置多个产品:
① minApi21 的 demo 、②minApi21 的 full 、③minApi23 的 demo 、④minApi23 的 full 、⑤minApi24 的 demo 、⑥minApi24 的 full
二、小试牛刀
从以上官网介绍可知产品多维度,即是在同一个工程上配置编译出各风味的apk版本,比如:演示用的简化版的和完整功能release版、两个平台UI的差异、多个项目之间功能增减...等等,通过多维度配置就不用一个版本维护一份工程,也不会因判断逻辑太多,导致代码臃肿。下面简单使用一下多版本管理的工具–priductFlavors:
(1)在 build.gradle 中添加自定义的风味维度:
// Specifies a flavor dimension.
flavorDimensions "mode", 'platform' // 多渠道定义
productFlavors {
orginal {
// Assigns this product flavor to the 'mode' flavor dimension.
// This step is optional if you are using only one dimension.
dimension "mode"
} phone {
dimension "platform"
versionNameSuffix "-slide"
} tv {
dimension "platform"
versionNameSuffix "-button"
}
}
(2)同步、配置:
在build.gradle添加自定义维度同步后,可在 build/generated/source/buildConfig目录下找到对应的产品型号目录(默认是生成当前Build Variant配置的),也分别有debug和release的版本:
添加自定义维度后也可通过Gradle或者在Terminal中使用命令‘gradlew :app:assembleRelease
’直接构建打包,生成对应版本的apk:
(3)代码中获取配置文件"BuildConfig.java"中的各变量来实现对应型号产品特定的功能和逻辑:
上面构建打包的apk内部代码逻辑是有差异的,首先看看生成的 BuildConfig.java 内容,及各版本的差异:
①release和debug版本的差异:
②phone平台和tv平台版本的差异:
因此,在java代码中可以通过如下方式分别实现代码逻辑(以下通过FLAVOR变量控制,也可使用或搭配其他变量):
比如在我本地工具类 Utils.java 中定义了对应的字符串变量,对应 BuildConfig.java中生成的值:
public static final String FLAVOR_Phone = "orginalPhone";
public static final String FLAVOR_Tv = "orginalTv";
然后其它功能类的代码中就可以通过判断当前的配置变量实现对应型号的逻辑:
if (Utils.FLAVOR_Phone.equals(BuildConfig.FLAVOR)) {
//手机平台想实现的代码逻辑
} else if (Utils.FLAVOR_Tv.equals(BuildConfig.FLAVOR)) {
//电视机平台想实现的代码逻辑
} else {
//默认配置平台想实现的代码逻辑
}
此后,便可以通过 Build Variant 来选择某个配置,编译出对应的apk版本,而不用改动或者分别维护一份代码。
-end-
Android : 代码多维度管理(产品风味) - flavorDimensions & productFlavors的更多相关文章
- 值得细读!如何系统有效地提升Android代码的安全性?
众所周知,代码安全是Android开发工作中的一大核心要素. 11月3日,安卓巴士全球开发者论坛线下系列沙龙第七站在成都顺利举办.作为中国领先的安卓开发者社区,安卓巴士近年来一直致力于在全国各大城市举 ...
- Android 6.0权限管理
Android 6.0权限管理 关于权限管理 Android6.0 发布之后,Android 的权限系统被重新设计.在 23 之前 App 的权限只会在用户安装的时候询问一次,App一旦安装后就可以使 ...
- 在Android中查看和管理sqlite数据库
在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库位于/data/data/项目包/databas ...
- 编写高效的Android代码
编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)
在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...
- Android Studio配置统一管理依赖版本号引用
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo采用的是其中一个方案,其他方案请阅读参考资料<Android Studio中统一管理版本号引用配置> 使用步骤 ...
- Android应用的内存管理
管理应用的内存可以分为两个部分内容: 1. 首先需要理解:How Android Manages App Processes and Memory Allocation? 2. 其次需要考虑:我们设计 ...
- Java&Android代码规范
项目中直接导入Square的代码风格文件.(不导入Google的原因是Square同时提供了Java和Android两套统一风格,Google只提供了一套) Square Code Styles Go ...
- Android中的内存管理机制以及正确的使用方式
概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...
随机推荐
- highly variable gene | 高变异基因的选择 | feature selection | 特征选择
在做单细胞的时候,有很多基因属于noise,就是变化没有规律,或者无显著变化的基因.在后续分析之前,我们需要把它们去掉. 以下是一种找出highly variable gene的方法: The fea ...
- caffe-ssd
1.安装依赖 1 sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-ser ...
- 第二阶段——个人工作总结DAY02
1.昨天做了什么:昨天学习了Intent跳转的知识. 2.今天打算做什么:来实现这个功能. 3.遇到的困难:不会用隐式跳转,只会用显式跳转.
- hbase安装部署
hbase的安装 ①cp /mnt/hgfs/xiazai/hbase-1.2.5-bin.tar.gz /data tar -xzvf hbase-1.2.5-bin.tar.gz ②环境 sud ...
- springBoot配置,贴个图
spring: datasource: name: test url: jdbc:mysql://localhost:3306/epay?characterEncoding=UTF-8 usernam ...
- ireport部署到Linux服务器上遇到的问题解决
ireport报表在本地Windows环境运行正常,一旦部署到Linux环境上出现了如下问题: 1.打开报表,后台直接报net.sf.jasperreports.engine.util.JRFontN ...
- java中堆与栈的区别
堆与栈都是java中常用的存储结构,是内存中存放数据的地方. 堆:主要存放运行时创建(new)的对象.主要用于储存对象,存取速度慢,可以运行时动态分配内存,生命周期不需要提前确定. 栈:主要存放基础类 ...
- servlet-api-2.4.jar not loaded(转)
信息: validateJarFile(D:/xj/workspace/webworktest/webapp/WEB-INF/lib/servlet-api-2.4.jar) - jar not lo ...
- web服务器-----Tomcat 7.0安装
下载地址:http://tomcat.apache.org/ 1.下载 2.解压缩---c盘 3.运行bin\startup.bat 启动Tomcat服务器 运行bin\shutdown.bat关闭T ...
- ORM框架之SQLALchemy
一.面向对象应用场景: 1.函数有共同参数,解决参数不断重用: 2.模板(约束同一类事物的,属性和行为) 3.函数编程和面向对象区别: 面向对象:数据和逻辑组合在一起:函数编程:数据和逻辑不能组合在一 ...