差异管理
说到多渠道问题,不同的渠道一般会对应不同的渠道号,你当然可以通过修改一次打一个包这种纯手工的方式来生成你的多渠道包,但据听说国内某团购网站的Android App有100多个渠道.这里出现了什么?重复,反复的去打包而且这些包之前的差异很小(只是渠道号不同),和写代码一样我们应该复用,通过Gradle可以实现一个命令打出所有的渠道包,一个命令打出指定的渠道包.再复杂一点,你可能需要不同的渠道对应不同的签名文件,不同的icon,不同的服务器地址…这些都可以通过Gradle来方便的实现.
依赖管理:
做软件开发你可能需要依赖各种不同的jar,library.你当然可以通过将.jar/library工程下载到本地再copy到你的工程中,但不知你是否听说过国外有个叫中央仓库的东西,在这个仓库里你可以找到所有你能想到以及你从来没听说过的jar,aar…The Central Repository Search Engine 这里可以找到所有你需要的依赖,而你需要的只是指定一个坐标,如下:
compile’com.squareup.picasso:picasso:2.3.3
剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点:
剩下的依赖的寻找,下载,添加到classpath等你都不需要去关心,通过这种方式来维护依赖的好处有以下几点:
- 依赖不会进入到你的版本控制仓库中(默认会缓存到~/.gradle/下)
- 方便卸载装载依赖(只是一条坐标依赖,不需要删除即可)
- 方便的版本管理,如上图中的2.3.3既是picasso的版本号,若改为+就表示从中央仓库中下载最新的版本
- 不同工程的相同依赖不会存在重复副本(只在~/.gradle下存在一份)
项目部署
这方面我没怎么接触过,但据我所知通过一些插件,可以实现自动将你的输出(.jar,.apk,.war…)上传到指定仓库,自动部署…
Gradle概念
Gradle,这是一个基于 JVM 的富有突破性构建工具。
Gradle不单单是一个配置脚本,它的背后是三门语言。
◦ Groovy Language
◦ Gradle DSL
◦ Android DSL
DSL的全称是Domain Specific Language,即领域特定语言。
The Gradle wrapper
Gradle Wrapper 允许你在没有安装 Gradle 的机器上执行 Gradle 构建。
Gradle构建基础
build.gradle
一个项目中会有一个project build.gradle。与若干个module build.gradle.
你可以通过在命令行运行 gradle 命令来执行构建,gradle 命令会从当前目录下寻找 build.gradle 文件来执行构建。我们称 build.gradle 文件为构建脚本。严格来说这其实是一个构建配置脚本。
project与task
Gradle中,每一个待编译的工程都叫一个Project。每一个Project在构建的时候都包含一系列的Task。比如一个Android APK的编译可能包含:Java源码编译Task、资源编译Task、JNI编译Task、lint检查Task、打包生成APK的Task、签名Task等。插件本身就是包含了若干Task的。
Gradle脚本的执行时序
初始化,分析有哪些module将要被构建,为每个module创建对应的 project实例。这个时候settings.gradle文件会被解析。
配置,处理所有的模块的 build 脚本,处理依赖,属性等。这个时候每个模块的build.gradle文件会被解析并配置,这个时候会构建整个task的链表(这里的链表仅仅指存在依赖关系的task的集合,不是数据结构的链表)。先是project build.gradle后是module build.gradle,且从依赖树的叶节点执行。配置完了以后,有一个重要的回调project.afterEvaluate,它表示所有的模块都已经配置完了,可以准备执行task了。
执行,根据task链表来执行某一个特定的task,这个task所依赖的其他task都将会被提前执行。
Groovy基础[原创:任玉刚]
Groovy和Java的关系
Groovy是一门jvm语言,它最终是要编译成class文件然后在jvm上执行,所以Java语言的特性Groovy都支持,我们完全可以混写Java和Groovy。
Groovy的变量和方法声明
在Groovy中,通过 def 关键字来声明变量和方法。
def a = 1
def b = “hello world”
def int c = 1
def hello() {
println “hello world” // 方法调用省略括号
1; // 方法返回值省略return
}
def hello(String msg) {
println (msg)
}
// 方法省略参数类型
int hello(msg) {
println (msg)
return 1
}
// 方法省略参数类型
int hello(msg) {
println msg
return 1 // 这个return不能省略
println “done”
}
Groovy的数据类型
String,用于字符串拼接。
闭包,Groovy中有一种特殊的类型,叫做Closure,翻译过来就是闭包,这是一种类似于C语言中函数指针的东西。闭包用起来非常方便,在Groovy中,闭包作为一种特殊的数据类型而存在,闭包可以作为方法的参数和返回值,也可以作为一个变量而存在。
声明闭包
{ parameters ->
code
}
List和Map,Groovy加强了Java中的集合类,比如List、Map、Set等.List还有一种看起来很奇怪的操作符<<,表示向List中添加新元素的意思.
加强的IO.
其他特性
- 所有的Class类型,都可以省略.class
- 只要有属性就有Getter/Setter,反之亦然。
- with操作符
Book bk = new Book()
bk.id = 1
bk.name = “android art”
bk.press = “china press”
可以简写为:
Book bk = new Book()
bk.with {
id = 1
name = “android art”
press = “china press”
}
等等http://www.jianshu.com/p/ba55dc163dfd
定义Task
task myTask {
println “config myTask”
}
通过上述方式定义的task,括号内部的代码会在配置阶段执行。
要括号内的代码仅仅在执行我们的task的时候才执行,这个时候可以通过doFirst或者doLast来完成。
• doFirst:task执行时,最开始的操作
• doLast:task执行时,最后的操作
myTask.doLast {
println “after execute myTask”
}
myTask.doFirst {
println “before execute myTask”
}
doLast还有一个等价的操作leftShift,leftShift还可以缩写为<<
myTask << {
println “after execute myTask”
}
剩下的细节还是需要大家查看Gradle文档,其实学习Gradle就是一个查文档的过程。