Android Gradle 学习笔记(五):Gradle 任务 Task
在之前的学习中,我们了解到Gradle的构建工作都是由Task组合完成的。本节我们就来介绍一下 Task - 任务。
一、多种方式创建任务
在Gradle中,我们可以有很多种方式来创建任务。为什么有这么多种方式呢?这都依赖于Project提供的快捷方法以及TaskContainer提供的相关Create方法。所以我们阅读一些Gradle脚本的时候,见到一些不熟悉的创建任务的方法也不要奇怪,一般分为以下几种方式:
- 第一种:直接以一个任务名字创建任务。
- 第二种:以一个任务名字+一个对该任务配置的Map对象来创建任务。
- 第三种:任务名字+闭包配置。
- 第四种:任务名字+Map参数+闭包。
- 第五种:使用TaskContainer创建任务,调研tasks.create方法创建任务。
二、多种方式访问任务
其实我们在之前的学习的例子中,我们已经通过了一些方式访问了任务。下面我们整理一下相关的方式:
- 第一种:我们创建的任务都会作为项目(Project)的一个属性,属性名就是任务名,所以我们可以通过该任务名称访问和操作该任务。
- 第二种:任务都是通过TaskContainer创建的,TaskContainer就是我们创建任务的集合,在Project中我们可以通过tasks属性访问TaskContainer,所以我们可以以访问集合元素的方式访问我们的任务。
- 第三种:通过路径访问。方式有两种:get & find,区别在于get的时候找不到就会抛出UnknownTaskException异常,而find在找不到任务的时候会返回null。
- 第四种:通过名称访问。通过名字的访问也有两种:get & find,它们的区别和上面第三种介绍的一样。
值得强调的是,通过路径访问的时候,参数可以是任务路径也可以是任务的名字。但是通过名字访问的时候,参数值只能是任务的名字,不能为路径。
三、任务排序
其实并没有真正的任务排序功能,这个排序不像我们想象的通过设置优先级或者Order顺序实现,而是通过任务的shouldRunAfter和mustRunAfter这两个方法,它们可以控制一个任务应该或者一定在某个任务之后执行。通过这种方式,你可以在某些情况下控制任务的执行顺序,而不是通过强依赖的方式。
这个功能是非常有用的,比如我们设置的顺序是,必须先执行单元测试,然后才能进行打包,这就保证了App的质量。类似的情况还有很多,比如必须要单元测试之后,才能进行集成测试,打包成功之后才能进行部署发布等。
举例说明:
- taskB.shouleRunAfter(taskA):表示taskB应该在taskA执行之后执行,这里的应该而不是必须。所以有可能任务顺序并不会按预设的执行。
- taskB.mustRunAfter(taskA):表示taskB必须在taskA执行之后执行,这个规则相对更加严格。
四、任务的onlyIf断言
断言就是一个条件表达式。Task有一个onlyIf方法,它接受一个闭包作为参数,如果该闭包返回true,则该任务执行,否则就跳过。这有很多用途,比如控制程序哪些情况下打什么包,什么时候进行单元测试,什么情况下执行单元测试的时候不执行网络测试。
下面我们以一个打首发包的例子来说明:
final String BUILD_APPS_ALL="all";
final String BUILD_APPS_SHOUFA="shoufa";
final String BUILD_APPS_EXCLUDE_SHOUFA="exclude_shoufa"; task ex48QQRelease << {
println "打应用宝的包"
}
task ex48BaiduRelease << {
println "打百度的包"
}
task ex48HuaweiRelease << {
println "打华为的包"
} task ex48MiuiRelease << {
println "打Miui的包"
} task build {
group BasePlugin.BUILD_GROUP
description "打渠道包"
} build.dependsOn ex48QQRelease,ex48BaiduRelease,ex48HuaweiRelease,ex48MiuiRelease ex48QQRelease.onlyIf {
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_SHOUFA.equals(buildApps)
|| BUILD_APPS_ALL.equals(buildApps)){
execute = true
}else{
execute = false
}
}else{
execute = true
}
execute
} ex48BaiduRelease.onlyIf {
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_SHOUFA.equals(buildApps)
|| BUILD_APPS_ALL.equals(buildApps)){
execute = true
}else{
execute = false
}
}else{
execute = true
}
execute
} ex48HuaweiRelease.onlyIf {
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
|| BUILD_APPS_ALL.equals(buildApps)){
execute = true
}else{
execute = false
}
}else{
execute = true
}
execute
} ex48MiuiRelease.onlyIf {
def execute = false;
if(project.hasProperty("build_apps")){
Object buildApps = project.property("build_apps")
if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
|| BUILD_APPS_ALL.equals(buildApps)){
execute = true
}else{
execute = false
}
}else{
execute = true
}
execute
}
在例子中,我们定义了4个渠道,其中百度和应用宝是首发包,另外两个华为和MiUi不是首发包,通过build_apps属性来控制我们要打哪些渠道包。
通过这种方式,我们在进行一些相关流程控制上会更加灵活。这在我们使用JenKins等CI工具进行自动化打包和部署的时候就能很好的体现出来。
五、多渠道打包(补充资料)
1.Gradle多渠道打包(动态设定App名称,应用图标,替换常量,更改包名,变更渠道):https://www.jianshu.com/p/533240d222d3
2.Android Gradle 多版本多APK打包,修改生成APK名称:https://blog.csdn.net/aiynmimi/article/details/68944830
Android Gradle 学习笔记(五):Gradle 任务 Task的更多相关文章
- Android Studio 学习笔记(五):WebView 简单说明
Android中一个用于网页显示的控件,实际上,也可以看做一个功能最小化的浏览器,看起来类似于在微信中打开网页链接的页面.WebView主要用于在app应用中方便地访问远程网页或本地html资源.同时 ...
- Android Studio系列教程五--Gradle命令详解与导入第三方包
Android Studio系列教程五--Gradle命令详解与导入第三方包 2015 年 01 月 05 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://s ...
- Android Studio 学习笔记(一)环境搭建、文件目录等相关说明
Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...
- Android:日常学习笔记(8)———探究UI开发(5)
Android:日常学习笔记(8)———探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...
- Android:日常学习笔记(2)——分析第一个Android应用程序
Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...
- Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例
---------------------------------------------------------------------------------------------------- ...
- Android:日常学习笔记(6)——探究活动(3)
Android:日常学习笔记(6)——探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...
- Android自动化学习笔记:编写MonkeyRunner脚本的几种方式
---------------------------------------------------------------------------------------------------- ...
- android开发学习笔记000
使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
随机推荐
- python map函数 reduce函数
Python中map()函数浅析 函数式编程: 更好的描述问题 map函数 怎么理解当传入多个参数list时,map如何运作: abc函数第一次传入的数据时 (11,44,77),然后(22,5 ...
- linux命令学习笔记(10):cat 命令
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示, 或者从标准输入读取内容并显示,它常与重定向符号配合使用. .命令格式: cat [选项] [文件] ...
- 【ML】关于神经网络优化问题的随笔记
1. 为什么不去试着最大化正确分类的图像数量而使用二次代价函数? 在神经网络中,被正确分类的图像数量所关于权重和偏置的函数并不是一个平滑的函数.大多数情况下,对权重和偏执做出的微小变动完全不会影响被正 ...
- 浅谈vue路由原理
Vue的路由实现:hash模式 和 history模式 hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用window.location.hash读取: 特点:hash虽然在UR ...
- Operating System-Thread(5)弹出式线程&&使单线程代码多线程化会产生那些问题
本文主要内容 弹出式线程(Pop-up threads) 使单线程代码多线程化会产生那些问题 一.弹出式线程(Pop-up threads) 以在一个http到达之后一个Service的处理为例子来介 ...
- Centos下Yum安装PHP5.5
默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...
- unittest单元测试生成HTML测试报告
前言: HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展,它可以生成 HTML的 测试报告. 一.下载HTMLTestRunnerNew.py文件: 下载链接 ...
- GIF助手帮助说明
生成的文件位置? 生成的GIF等文件存储在 /sdcard/gifdir/ 目录下. 为什么分享到微信.Twitter等平台失败? 微信.Twitter等平台对GIF文件大小有限制,微信限制为1MB, ...
- JAVA基础知识总结3(面向对象)
特点:过程其实就是函数:对象是将函数等一些内容进行了封装 1:将复杂的事情简单化. 2:面向对象将以前的过程中的执行者,变成了指挥者. 3:面向对象这种思想是符合现在人们思考习惯的一种思想. 匿名对象 ...
- win7下在eclipse3.7中使用hadoop1.2.1插件运行MadReduce例子
环境 win7+hadoop_1.2.1+eclipse 3.7+maven 3 1.在win7下下载hadoop_1.2.1 2.安装hadoop的eclipse插件,注意eclipse 4.x版本 ...