前面学习了 gradle的基础——groovy的基本语法,现在可以深入点,列个知识小点目录:
- 闭包
- 基础详解
- 代码块
- 参数 -> 左边为参数 右边为代码块 可以使用${}引用代码块
- 返回值
- 三个重要变量
- this:代表闭包定义处的类
- owner:代表闭包定义处的类或者对象
- delegate:代表任意对象 (默认owner一致)
- 闭包的委托策略
- 使用详解
- 进阶讲解
- 基础详解
- 数据结构
- 列表
- 列表排序 sort()
- 列表查询 find() findAll() any() every() min() max()
- 映射 - map
- 索引:key必须为字符串,value可以为任何对象
- 添加
- 遍历 each
- 直接遍历key-value
- 遍历entery
- 查找 find findAll collect
- 分组 groupBy
- 排序
- 范围 -Range
- List的子类
- 列表
- 面向对象
- 类
- 接口
- trait :和接口差不多,但是可以实现方法,不实现的方法抽象出来
- 元编程
- 方法:本类中没有 -> MeteClass ->是否重写MethodMissing() ->是否重写InvokeMethod()
- 为String类添加一个反转的方法
- 进阶使用
- json操作
- 对象转json:toJson()
- json转对象:jsonSlpuer.parse()
- xml处理
- 解析xml:XmlSlurper.parseText(xml)
- 生成xml:MarkupBuilder(StringWriter)
- 遍历:
- 深度遍历:.depthFirst().findAll{}
- 广度遍历:.children.findAll{}
- 作业json文件转换成xml文件
- 普通文件操作
- eachLine、getText、readLines :遍历文件内容
- withReader :读取文件部分内容、不需要关闭流,内部有关流的操作
- withObjectOutputStream:操作对象输出流
- withObjectInputStream:操作对象输入流
- json操作
- Gradle
- project
- project API
- project相关api
- allprojects{}、project{}、subprojects{} 作用范围不同:所有project、当前project、子project(不包括当前project)
- apply from :引入gradlec文件
- task相关api
- 属性相关api
- ext{} :扩展属性
- gradle.properties : 所有build.gradle中的属性都可以在这里定义
- file相关api
- 路径获取
- getRootDir()
- getBuildDir()
- getProjectDir()
- 文件操作 --同一个工程下操作
- 文件定位
- file() 相对于当前project中寻找
- form file('XXXXXX') into XXXXX 拷贝文件
- file() 相对于当前project中寻找
- 文件遍历
- fileTree(文件地址){}
- 文件定位
- 路径获取
- gradle生命周期api
- 其他api
- 依赖相关api
- buildscript{ }
- respositories{ 仓库地址 }
- dependencies{ 工程的插件依赖地址 }
- exclude 排除依赖
- transitive 传递依赖 尽量减少应用
- compile
- provided 编译时会引用第三方所有类 打包时 不会直接打入包中(一、只在编译阶段起作用时用 二、在主工程中有引用的情况下)
- buildscript{ }
- 外部命令执行方法
- 依赖相关api
- project相关api
-
- project API
- Task
- 创建Task
- 直接通过task函数创建
- 通过TaskContainer去创建task: this.tasks.create("task名"){ }
- Task配置:描述、分组、类型、依赖、重写、执行逻辑
- 执行阶段 先执行外部再执行内部
- doFirst:执行阶段执行
- doLast:追加任务,Task前面加入执行过程
- 计算build执行时长
- task执行顺序
- 同时依赖多个task ,依赖的task随机顺序执行
- mustRunAfter 指定运行顺序
- task输入输出
- task类型
- 创建Task
- gradle其他
- settings:gradle的初始化阶段就是执行settings.gradle中的内容
- SourceSet:决定源码、资源、库 存放的位置
- plugin:
- @TaskAction:执行于gradle执行阶段的代码
- Android 插件
- Variants 变体
- gradle工程
- 迁移
- 改造
- project
- 其他
- Groovy没有网络的jar包 需要借助java中的Httpconnection之类的
对于Android开发者而言,深入gradle学习的成本较大,从业务角度考虑,不建议太深入学习,以可以写简单的gradle构建脚本和看懂复杂的脚本为目标!
1、构建块
Gradle构建都包含三个基本构建块 project、task、property
一个项目(project)代表一个正在构建的组件(比如,一个jar文件)
-
项目:支持多项目构建
-
任务:
-
任务动作:定义一个当任务执行时最小的工作单元,如打印文本
-
任务依赖:任务之间的相互依赖
-
-
属性:新建的Task类都是Default类型的,所有的属性的都是private的,只能通过getter、setter来访问
2、Task的使用
-
task依赖 - dependsOn
注意:task的执行顺序是不确定的,其执行顺序又task的输入/输出规范自动确定
-
终结器Task(finalizer task)
区分finalizer task 和 finalized task的概念
task taskX << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
taskX.finalizedBy taskY
taskX就是被修饰的,taskY修饰的,所以taskX是finalized task,taskY是finalizer task
3. Task的配置:不用定义动作或者使用左移操作符(<<),没有任何依赖关系,task配置块永远在task动作执行之前被执行,完全取决于Gradle构建的生命周期
3、Task构建生命周期
-
初始化:寻找哪些task依赖需要参与到构建中
-
配置:构造一个模型表示任务,并参与到构建中
-
执行:按Task的顺序执行
构建过程中有一点要说,就是gradle的增量式构建,也是gradle的特性,前提是为每个Task定义输入(inputs)、输出(outputs),如果在执行一个Task时,它的输入与输出与前一次没有发生变化,那么该Task为最新(UP-TO-DATE),gradle不予执行。
1、自定义Task
创建一个动作方法和暴露它的配置属性,可以实现一个自定义的task
2、gradle内置的task类型:Copy、Zip、Delete、War....
3、声明task规则:
-
获得对TaskContainer的引用
-
调用addRule(String,Closure)--第一个参数:描述型信息,第二个参数:应用规则的闭包
3、根据约定大于配置的特性,Gradle在buildSrc目录下使原文件结构标准化,一般将构建代码放在buildSrc目录下
4、了解构建生命周期之后可以做点事了,可以通过hook的方式,在初始化、配置以及构建阶段,实现自己的需求
6、通过监听器监听构建生命周期
-
编写一个特定的类实现特定的监听接口(TaskExcutionGraphListener接口提供)
-
注册监听器实现