问题:

需要构建大体上一样,但是使用不同资源或者类的应用。

解决方案:

产品的flavors可以帮助你对同一个app创建不同的版本。

讨论:

build types是开发过程的一部分,一般用来将app从开发版进化到生产版。默认的build types:debug和release反应了这个。

Flavors让你能够构建同一个app的不同版本。当你想对不同版本的app自定义不同的外观,或者你需要一个免费版和收费版的app,你可以使用Flavors。

可以使用productFlavors块来声明product的flavor。

考虑下这样的场景,设置一个基于简单edittext入口的“helloworld”风格的欢迎界面。你给app设置不同的flavors:“friendly”,“arrogant”,“obsequious”:

android {
productFlavors {
arrogant {
applicationId 'com.oreilly.helloworld.arrg'
}
friendly {
applicationId 'com.oreilly.helloworld.frnd'
}
obsequious {
applicationId 'com.oreilly.helloworld.obsq'
}
}
}

每个都有不同的applicationId,这样三个都可以安装在同一个设备上面。

注:flavor的名字不可以和已经存在build type的名字或者预定义的androidTest相同。

每个产品的flavor都有下列属于自己的属性,其中,都是基于defaultConfig中相同的属性:

applicationId

minSdkVersion

targetSdkVersion

versionCode

versionName

signingConfig

每个flavor定义自己的代码设置和资源,它们是主目录的同级代码。意味着,除了app/src/main/java文件夹外,你可以把代码放在以下的目录:

app/src/arrogant/java

app/src/friendly/java

app/src/obsequious/java

你也可以增加额外的资源文件在:

app/src/arrogant/res

app/src/arrogant/res/layout

app/src/arrogant/res/values

同样的资源结构会被应用到所有flavors,如:

相似的文件结构。一个build type和一个flavor的组合被称作variant。对于默认的两个build types(debug和release)和上面展示的三个flavors(arrogant,friendly和obsequious),6种不同变体(variant)的apk可以被生成。

为了看到所有可能的变体名,可以在module的build文件中增加自定义任务:

task printVariantNames() {
doLast {
android.applicationVariants.all { variant ->
println variant.name
}
}
}

在命令行下执行./gradlew printVariantNames

为了部署一个指定的变体,android sudio提供了一个build variant的视图。可以在下拉列表中选择合适的变体:

  

product flavors使用后,assemble任务会构建所有可能的变体。assemble<variant>任务会构建指定的build type和flavor。你也可以使用assemble<BuildType>构建这个build type下所有的flavors,或者使用assemble<Flavor>任务构建这个flavor下所有的build type。install任务被分配到每个变体,如installArrogantDebug或者installFriendlyRelease。

Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.2——设置Flavors和Variants的更多相关文章

  1. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)2.1——设置项目参数

    问题: 开发的时候经常需要向项目中添加一些额外的参数或者硬编码的值. 解决方案: 使用ext块设置公用的值.如果需要从build文件中移除这些值,可以将参数放到gradle.properties文件中 ...

  2. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.5——在flavors间合并java代码

    问题: 你想要在单独的product flavors里面增加Acitivity或者其它java类. 解决方案: 创建合适的代码目录,增加java类,将它们和main代码合并. 讨论: flavors和 ...

  3. Android开发工具全面转向Android Studio(3)——AS project/module的目录结构(与Eclipse对比)

    如果AS完全还没摸懂的,建议先看下Android开发工具全面转向Android Studio(2)——AS project/module的CRUD. 注:以下以Windows平台为标准,AS以目前最新 ...

  4. Android开发工具全面转向Android Studio(2)——AS project/module的CRUD

    本文有些地方可能需要衔接Android开发工具全面转向Android Studio(1)——准备开发环境,读起来效果会更好. 这个世界很奇妙,所有的东西离不开CRUD,即增删改查.即使人本身也遵循这个 ...

  5. 配置cordova的android开发环境(无android studio)

    原文:配置cordova的android开发环境(无android studio) 趁元旦放假想试一下cordova,不想安装庞大的android studio,所以想最小化安装,居然花了一整天的时间 ...

  6. 收集整理Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材等。

    AndroidDevTools Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具.An ...

  7. Eclipse搭建Android开发环境并运行Android项目

    Eclipse搭建Android开发环境并运行Android项目 (详细) 安装环境: window 10 64位 安装工具: JDK.Eclipse.SDK.ADT 安装步骤: 1.JAVA JDK ...

  8. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.2——DSL文档

    问题: 你需要查找Android Gradle DSL的完整文档. 解决方案: 访问Gradle Tools网站,从Android开发网站下载ZIP文件. 讨论:Android开发网站首页有完整的AP ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.1——推荐配置

    问题: 你想要提高Gradle的构建效率. 解决方案: 使用下面推荐的技术组合. 讨论: 首先,这里没有可以影响app表现的建议.有很多你可以做的事来提高app,很多都和Android的混淆工具有关. ...

随机推荐

  1. opencv提取surf特征点出现的错误

    opencv实现surf特征的提取.本来是一个非常easy的代码,结果我执行时却出现了各种错误,以下来谈谈我出现的错误及问题的解决过程. 首先,我把提取surf特征的过程整合成了一个函数,我单独建立一 ...

  2. python——PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的.所以今天下午我根据PEP 8整理了一份,以后都照此 ...

  3. JavaScript内存示意图

    一.JavaScript内存示意图 二.js原理 1.js执行规则 (1)先定义 定义变量.定义函数.顺序:自上而下. (2)后执行 除了定义外的代码都是执行代码.顺序:自上而下. 2.动态开辟内存 ...

  4. 【BIEE】12_查看BIEE的物理SQL

    有时候,我们在使用BIEE的时候回出现一些问题,需要借助物理SQL来进行问题分析.通过物理SQL我们就可以看到BIEE在数据库中是如何去检索出数据库. 查看物理SQL的方式 [登录BIEE]--[管理 ...

  5. flash画图API:解析obj格式

    又到了周末的时间,依旧的例牌菜.只是近期在和一些同事交流下,学习了一些新的知识.过去一直没有明确的问题,如今总算有点感觉了. 平时编程偶然会用到数学,特别是在做3d的时候.相信看过rokix的3d,那 ...

  6. Activity具体解释(生命周期、启动方式、状态保存,全然退出等)

    一.什么是Activity? 简单的说:Activity就是布满整个窗体或者悬浮于其它窗体上的交互界面. 在一个应用程序中通常由多个Activity构成,都会在Manifest.xml中指定一个主的A ...

  7. jumpserverv0.5.0 基于 CentOS7安装部署

    基于 CentOS 7 一步一步安装 Jumpserver 0.5.0 环境 系统: CentOS 7 IP: 192.168.244.144 关闭 selinux和防火墙 # CentOS 7 $ ...

  8. iOS开发-Swift获取手机设备信息(UIDevice)

    使用UiDevice获取设备信息 获取设备名称 let name = UIDevice.currentDevice().name 获取设备系统名称 let systemName = UIDevice. ...

  9. .NET 环境中使用RabbitMQ RabbitMQ与Redis队列对比 RabbitMQ入门与使用篇

    .NET 环境中使用RabbitMQ   在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...

  10. 234. Palindrome Linked List【easy】

    234. Palindrome Linked List[easy] Given a singly linked list, determine if it is a palindrome. Follo ...