一、关于配置产品风味

  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的更多相关文章

  1. 值得细读!如何系统有效地提升Android代码的安全性?

    众所周知,代码安全是Android开发工作中的一大核心要素. 11月3日,安卓巴士全球开发者论坛线下系列沙龙第七站在成都顺利举办.作为中国领先的安卓开发者社区,安卓巴士近年来一直致力于在全国各大城市举 ...

  2. Android 6.0权限管理

    Android 6.0权限管理 关于权限管理 Android6.0 发布之后,Android 的权限系统被重新设计.在 23 之前 App 的权限只会在用户安装的时候询问一次,App一旦安装后就可以使 ...

  3. 在Android中查看和管理sqlite数据库

    在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看.android项目中的sqlite数据库位于/data/data/项目包/databas ...

  4. 编写高效的Android代码

    编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...

  5. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)

    在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...

  6. Android Studio配置统一管理依赖版本号引用

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本Demo采用的是其中一个方案,其他方案请阅读参考资料<Android Studio中统一管理版本号引用配置> 使用步骤 ...

  7. Android应用的内存管理

    管理应用的内存可以分为两个部分内容: 1. 首先需要理解:How Android Manages App Processes and Memory Allocation? 2. 其次需要考虑:我们设计 ...

  8. Java&Android代码规范

    项目中直接导入Square的代码风格文件.(不导入Google的原因是Square同时提供了Java和Android两套统一风格,Google只提供了一套) Square Code Styles Go ...

  9. Android中的内存管理机制以及正确的使用方式

    概述 从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源.现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操 ...

随机推荐

  1. 雷林鹏分享:C# 程序结构

    C# 程序结构 在我们学习 C# 编程语言的基础构件块之前,让我们先看一下 C# 的最小的程序结构,以便作为接下来章节的参考. C# Hello World 实例 一个 C# 程序主要包括以下部分: ...

  2. centos 下卸载mysql

    查看当前已安装服务 [root@localhost]# rpm -qa|grep -i mysqlMySQL-server-5.6.36-1.rhel5.x86_64qt-mysql-4.8.5-13 ...

  3. 【debug、info、warn、error】四者之间的区别与用法

    debug:需要在调试过程中输出的信息,但发布后是不需要的(当然发布后,也是看不到的) info:需要持续输出的信息(无论调试还是发布状态) warn:警告级别的信息(不严重) error:错误信息( ...

  4. java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have available server for client: service-one

    一.异常信息 java.lang.RuntimeException: com.netflix.client.ClientException: Load balancer does not have a ...

  5. Agile敏捷开发Planning Poker简介

    ​​关注嘉为科技,获取运维新知 一.为什么不用“人天”? 传统的IT项目,尤其是软件开发项目,往往使用“人天”来作为工作量评估的量词.甚至是代表一种评估方式.在软件项目开发经典著作<人月神话&g ...

  6. 网络基础之socket

    socket 我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程.能够唯一标示网络中的进程后,它 ...

  7. DP 要求将承载量花光的01背包问题

    前言:很久没有发博客了,以后会捡起来,之后很长一段时间内我都会把精力放在攻克DP问题上,所以会经常上传一些DP学习笔记,把一些比较好的,没见过类型的DP问题都会传上来,希望能够变强吧. 因为今天很清醒 ...

  8. rsync未授权访问漏洞利用

    漏洞描述:rsync是Linux系统下的数据镜像备份工具,使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他ssh,rsync主机同步.也就是说如果你可以连接目标IP的r ...

  9. P4238 【模板】多项式求逆 ntt

    题意:求多项式的逆 题解:多项式最高次项叫度deg,假设我们对于多项式\(A(x)*B(x)\equiv 1\),已知A,求B 假设度为n-1,\(A(x)*B(x)\equiv 1(mod x^{\ ...

  10. Excel文件的读写

    import xlsxwriter,xlrd import sys,os.path fname = 'zm6.xlsx' if not os.path.isfile(fname): print ('文 ...