Groovy
一种基于JVM(Java虚拟机)的敏捷开发语言,能够与 Java 代码很好地结合。
Groovy特点:
- Groovy 的松散的 Java 语法允许省略分号和修改符。
- Groovy 的所有内容都为 public,除非另行指定。
- Groovy 允许定义简单脚本,同时无需定义正规的 class对象。
- Groovy 语法允许省略变量类型。
Eclipse安装Groovy插件:https://github.com/groovy/groovy-eclipse/wiki
Groovy用法举例:
// 定义函数
def repeat(val) {
for(i = 0; i < 5; i++) {
println val
}
}
repeat("hello")
// 定义集合
def range = 0..4
println range
def coll = ["Groovy", "Java", "Ruby"]
println coll
coll.add("Python")
coll << "Small Talk"
// 定义map映射
def hash = [name:"Andy", "VPN-#":45]
println hash
println hash.getClass()
println hash.get("name")
// 闭包
// 默认关键字it,指向被调用的外部集合的每一个值
hash.each {
println it
}
// 自定义变量
hash.each { value ->
println value
}
// 使用多个参数
hash.each { key, value ->
println "${key}:${value}"
}
// 闭包类似函数指针的用法
def combine = { val1, val2 ->
return "${val1} + ${val2}"
}
println combine("Good", "Luck")
// 类
class Song {
def name
def artist
def genre
}
def sng2 = new Song(name:"Kung Fu Fighting", genre:"Disco")
sng2.artist = "Jack"
println sng2.name
Gradle
定义任务(Task)以及任务间的依赖(Dependency),形成一个有向无环图。当在根目录下执行gradle时,先解析执行根目录下的setting.gradle和build.gradle两个文件,然后依次解析执行每个module目录下的build.gradle文件。
生命周期:
- 初始化(Initialization)
初始化阶段,会去读取根工程中setting.gradle中的include信息,决定有哪几个工程加入构建,创建project实例,比如下面有三个工程:
include ':app', ':lib1', ':lib2'
gradle运行时系统会为settings.gradle文件生成一个settings隐含对象,会为每个build.gradle生成一个project对象,这些文件中调用的方法没有显示其实都是调用其对应的隐含对象的方法。比如上面这句话就是执行了一行代码:
settings.include(":app")
对于settings对象和project对象的更多方法和属性,可以从官网查询。
- 配置(Configuration)
配置阶段,会去执行所有工程的build.gradle脚本,配置project对象,一个对象由多个任务组成,此阶段也会去创建、配置task及相关信息。 - 执行(Execution)
运行阶段,根据gradle命令传递过来的task名称,执行相关依赖任务。
task
task hello {
doFirst {
println 'first'
}
doLast {
println 'last'
}
println 'hello task'
}
task hello2 << {
println 'hello2'
}
task hello3(dependsOn: hello) {
doLast {
println "hello3"
}
}
对生命周期的响应
在经历生命周期的不同阶段时,构建脚本会接受到不同的通知消息(Notification),可以捕获这些消息并做一些相应的处理。
whenTaskAdded:当一个task被添加的时候
tasks.whenTaskAdded { task ->
switch (task.name) {
case 'bfd':
task.dependsOn 'assembleDebug'
break;
case 'bfr':
setAllConfig(app_version, online, version_name)
task.dependsOn 'assembleRelease'
break;
}
}
task bfd << {}
whenReady:配置完成后
gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.hasTask(release)) {
version = '1.0'
} else {
version = '1.0-SNAPSHOT'
}
}
beforeTask/afterTask:task执行前后
gradle.taskGraph.afterTask { Task task, TaskState state ->
if (state.failure) {
println "FAILED"
} else {
println "done"
}
}
productFlavors使用
在productFlavors下可以建立多个不同的分支
- 每个分支可以使用不同的配置文件。defaultConfig是共用的默认配置,在这里面添加的配置会出现在生成的BuildConfig.java文件中。在productFlavors每个分支里定义的配置会覆盖默认配置。如下配置,在不同的应用市场采用不同的开启或关闭自动更新的功能。
android {
defaultConfig {
applicationId "com.magic.wdl.animatedlinearlayout"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
...
buildConfigField "boolean", "AUTO_UPDATES", "true"
}
...
productFlavors {
wandoujia {
buildConfigField "boolean", "AUTO_UPDATES", "false"
}
huawei {
buildConfigField "boolean", "AUTO_UPDATES", "true"
}
}
}
- 每个分支会对应一个dataSet,可以对不同分支的dataSet使用不同的资源文件,比如不同的分支使用不同的包名或logo。如下配置,在不同应用市场使用不同的包名:
android {
...
productFlavors {
wandoujia {
}
huawei {
}
}
}
不同productFlavors对应不同的dataSet
huawei/res/values/string.xml
<resources>
<string name="app_name">华为市场包</string>
</resources>
wandoujia/res/values/string.xml
<resources>
<string name="app_name">豌豆荚市场包</string>
</resources>
参考:
http://www.ibm.com/developerworks/cn/education/java/j-groovy/j-groovy.html
http://tech.meituan.com/mt-apk-adaptation.html
http://jiajixin.cn/2015/08/07/gradle-android/
网友评论