一、关于配置产品风味

  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. ThinkPHP实用项

    跟踪信息 – 两种模式 – Sql调试 – 性能调试

  2. maven 把本地jar包打进本地仓库

    maven 把本地jar包打进本地仓库 1.本地有自己写的项目jar包,但是需要用maven依赖对其进行引用: 2.某个jar包在远程仓库没有,导致pom.xml报错,此时可以从网上单独下载此jar包 ...

  3. 如何理解机器学习/统计学中的各种范数norm | L1 | L2 | 使用哪种regularization方法?

    参考: L1 Norm Regularization and Sparsity Explained for Dummies 专为小白解释的文章,文笔十分之幽默 why does a small L1 ...

  4. BASE64图片转字符串

    Java代码图片字符串互转 /** * 将base64字符串转成图片 * TODO * @param imgStr base64图片字符串 * @param path 目标输出路径 * @return ...

  5. ZOJ - 3661 pam

    题意:给一个字符串,和每个字符代表的val,每个回文串的价值就是前半部分的val26进制%777777777,求价值第k小的回文串 题解:建个pam,然后dfs两边(0,1),统计价值sort一遍就好 ...

  6. 浅谈线程runnable和callable的使用及区别

    线程使用比较广泛,但实际上一般项目很少用上线程,线程常用于优化复杂的程序执行流程,把一些与业务关系关系不大但是必须要执行的流程使用线程的方式让子线程去执行,主流程只返回跟业务有关的信息 runnabl ...

  7. IIS Web 服务器/ASP.NET 运行原理基本知识概念整理 转

    转http://www.cnblogs.com/loongsoft/p/7272830.html IIS Web 服务器/ASP.NET 运行原理基本知识概念整理  前言:      记录 IIS 相 ...

  8. js正则、js全选、反选、全不选、ajax批删

    <button onclick="fun1()">全选</button><button onclick="fun2()">全 ...

  9. Vue SSR常见问题、异常处理以及优化方案

    本文主要介绍Vue SSR(vue服务端渲染)的应用场景,开发中容易遇到的一些问题,提升ssr性能的方法,以及ssr的安全性问题. SSR的应用场景 1.SEO需求 SEO(Search Engine ...

  10. linux 逻辑卷管理 /dev/mapper/VolGroup-lv_root 100%调整分区大小

    1.解决过程 # df -h   // 查看分区 # umount /home   // 取消挂载 # e2fsck -f /dev/mapper/VolGroup-lv_home   // 分区检测 ...