Android Studio 的编译构建,是基于Gradle的, 而Gradle又是基于Groovy, Groovy又是基于Java的。
Groovy基本语法理论介绍
Gradle是一种基于Groovy语言(DSL)来声明的,所以我们很有必要先了解下Groovy 语言。Groovy 语言是用于Java虚拟机的敏捷语言,是可以用于面对对象编程,又可以用作纯粹的脚本语言,同时有具有闭包和动态语言的其他特性。
基本特性:
- Groovy 完全兼容java语法
- 末尾的分号是可选的
- 类、方法默认是public的
- 编译器会自动添加getter/setter方法
- 属性可以用.号获取
- 最后一个表达式的值会作为返回值的,return关键字可省略
- ==等同于equals(),不会有NullPointerExceptions
- 在Groovy中使用def关键字定义的变量类型都是Object,
定义方法时,通常可以省略def关键字,尽量别def和类型混用,避免这种写法def String name = “Guillaume”。def类似js中的var
高效特性
- assert 断言语句 可以写在任何地方
- 可选类型定义,相当于若类型语言 ,类型会自动推导出来的
- 可选的括号 ,方法如过有有参数,()可以不写
- 字符串 有三种 分别为 ‘’ 、 “” 、 ‘’’ ‘’’ ,引用${}
- 闭包
参考:
apache groovy官方文档
Gradle DSL语法官方文档
使用Groovy开发之新特性
任玉刚:Gradle从入门到实战 - Groovy基础
刘望舒:Gradle核心思想(三)Groovy快速入门指南
Android构建02-Groovy基础
Gradle系列之Groovy基础篇
Android Gradle Groovy自动化构建入门篇
Gradle Android-build 常用命令参数及解释
一句话表明Groovy的地位:Groovy于Gradle,好比Java于Android
gradle 任务查询命令
# 查看任务
./gradlew tasks
# 查看所有任务 包括缓存任务等
./gradlew tasks --all
# 对某个module [moduleName] 的某个任务[TaskName] 运行
./gradlew :moduleName:taskName
说明,module 定义在 工程根 settings.gradle 下
快速构建命令
# 查看构建版本
./gradlew -v
# 清除build文件夹
./gradlew clean
# 检查依赖并编译打包
./gradlew build
# 编译并安装debug包
./gradlew installDebug
# 编译并打印日志
./gradlew build --info
# 译并输出性能报告,性能报告一般在 构建工程根目录 build/reports/profile
./gradlew build --profile
# 调试模式构建并打印堆栈日志
./gradlew build --info --debug --stacktrace
# 强制更新最新依赖,清除构建并构建
./gradlew clean build --refresh-dependencies
#强制刷新依赖:
./gradlew --refresh-dependencies assemble
#多任务调用:
./gradlew clean jar
#查看帮助:
./gradlew -?或./gradlew -h或./gradlew -help
gradle 指定构建目标命令
# 编译并打Debug包
./gradlew assembleDebug
# 这个是简写 assembleDebug
./gradlew aD
# 编译并打Release的包
./gradlew assembleRelease
# 这个是简写 assembleRelease
./gradlew aR
gradle 构建并安装调试命令
# 编译并打Debug包
./gradlew assembleDebug
# 编译app module 并打Debug包
./gradlew install app:assembleDebug
# 编译并打Release的包
./gradlew assembleRelease
# Release模式打包并安装
./gradlew installRelease
# 卸载Release模式包
./gradlew uninstallRelease
gradle 查看包依赖
./gradlew dependencies
# 或者模组的 依赖
./gradlew app:dependencies
# 检索依赖库
./gradlew app:dependencies | grep CompileClasspath
# windows 没有 grep 命令
./gradlew app:dependencies | findstr "CompileClasspath"
# 将检索到的依赖分组找到
# 比如 multiDebugCompileClasspath 就是 multi 渠道分发的开发编译依赖
./gradlew app:dependencies --configuration multiDebugCompileClasspath
# 一般编译时的依赖库,不是固定配置方式,建议检索后尝试
./gradlew app:dependencies --configuration compile
# 一般运行时的依赖库,不是固定配置方式,建议检索后尝试
./gradlew app:dependencies --configuration runtime
gradle中的task执行顺序
在 Gradle 中,最重要的两个概念是 Project(项目) 和 Task(任务)。
每一次构建都至少包含一个 Project,每一个 Project 又包含了一个或多个 Task。
每个 build.gradle 文件都代表一个 Project,其实 Project 可以理解为在业务范围内,
被抽象出来的一个个独立的模块。而 Task 一般被定义在 build.gradle 中,它表示一个操作,
比如:复制文件、打个 jar 包、上传文件等。
参考:gradle中的task
优先顺序为depensOn > 自己 > doFirst > doLast > “>>符号”
task task2{
println "task2"
}
task task3{
println "task3"
}
task task4{
println "task4"
}
task task1(dependsOn:[task2,task3,task4]){
println "task1"
doFirst{
println "task1 first"
}
doLast{
println "task1 last"
}
}
//注:操作符<< 用在Task定义上相当于doLast
task1 <<{
println "task1 append"
}
//输出结果
task2
task3
task4
task1
task1 first
task1 last
task1 append
f.排序:除了通过强依赖dependsOn来控制任务的执行顺序,
还可以通过 shouldRunAfter 和 mustRunAfter 实现
taskB.shouldRunAfter(taskA)
//表示taskB应该在taskA执行之后执行,有可能不会按预设执行
taskB.mustRunAfter(taskA)
//表示taskB必须在taskA执行之后执行