Gradle官网: http://gradle.org/
DSL Reference 相当于API
下载了如下的插件
Download https://jcenter.bintray.com/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.pom
Download https://jcenter.bintray.com/org/apache/commons/commons-parent/39/commons-parent-39.pom
Download https://jcenter.bintray.com/org/apache/apache/16/apache-16.pom
Download https://jcenter.bintray.com/com/google/guava/guava/20.0/guava-20.0.pom
Download https://jcenter.bintray.com/com/google/guava/guava-parent/20.0/guava-parent-20.0.pom
Download https://jcenter.bintray.com/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1.jar
Download https://jcenter.bintray.com/com/google/guava/guava/20.0/guava-20.0.jar
Download https://jcenter.bintray.com/org/apache/commons/commons-math3/3.6.1/commons-math3-3.6.1-sources.jar
Download https://jcenter.bintray.com/com/google/guava/guava/20.0/guava-20.0-sources.jar
介绍一下Gradle的基本知识
1.基本组件
Gradle中每个待编译的工程都叫Project。每一个Project在构建时都包含一系列的Task。一个Android APK 编译包含:
Java 源码编译Task、资源编译Task、JNI编译Task、Lint检查Task、打包生成APK的Task、签名Task等。
具体的编译工作通过插件完成。
1.1 一个例子
一个名为posdevice的目录,包含3个Android Library工程,2个Android 应用工程。
3个库项目
CPosDeviceSDK
CposSystemSdk
CposSystemSDkxxxImpl
2个应用项目
CPosDeviceServerApk
CPosSdkDemo
每一个Library和App都有独立的Project
在根目录下都有build.gradle,Project的编译脚本,类似于makefile文件
在android中,执行gradle assemble,来编译
如果想要把5个Project都编译出来,可以借助于 Multi-projects Build,怎么才能实现呢。
1.在项目中添加build.gradle。它的作用是 配置其他子project的属性
2.在项目中添加setting.gradle。名字必须是setting.gradle。它用来描述这个multiprojects包含哪些子projects
使用include方法 来导入工程
Setting.gradle除了可以导入还可以设置函数
1.2 gradle命令介绍
1.gradle projects 查看一个项目有多少project , 其实就是访问setting.gradle 中包含的 子project
2.gradle project-path:tasks 查看某个目录名: 中的任务 ,:不可省略
如果已经cd 进入到某个子项目文件夹中了,可以省略路径
3.gradle clean 执行清理任务,和 make clean类似
4.gradle properites 查看所有属性信息
5.gradle tasks 列出每个task的详细信息
Task之间有依赖关系,assemble task 依赖其他task先执行,assemble再最终输出
2.Gradle工作流程
Gradle 包含三个阶段:
1.初始化阶段,执行setting.gradle
2.配置阶段,解析每一个子项目中的build.gradle ,建立起一个task关系的有向图
3.执行任务
3.Gradle编程模型和API
Gradle的生命周期
3.1 Gradle对象
可以通过 Project.getGradle()获得Gradle对象
在项目中的build.gradle 和 setting.gradle 添加
println "build"+gradle.hashCode()
println "setting"+gradle.hashCode()
的结果:
两者得到的gradle对象的hashcode是同一个
在build.gradle 调用 gradleHomeDir 、gradleUserHomeDir、parent 的到
HomeDir是gradle的路径
UserHomeDir是个人电脑上gradle设置的位置,存储了缓存文件、类文件、插件
3.2 Project对象
每一个build.gradle 都会生成一个Project对象
在project中,我们要做三件事:
1.加载插件
2.配置好插件
3.设置插件属性
1.加载插件:
加载插件的过程就从调用apply方法开始,project实现了PluginAware接口。
Apply(map《String,?》option)
Groovy支持调用方法通过 参数名:参数值,参数名:参数值 方式传递参数如
Apply plugin:’com.android.library’
Apply plugin:’com.android.application’
可以把通用的函数放在utils.gradle文件里,让其他工程的build.gradle加载
Apply from:rootProject.getRootDir().getAbsolutePath()+”/utils.gradle”
2.设置属性
Gradle 提供了extra property 设置额外属性,第一次定义该属性时通过ext。定义好之后,后面的存取就不需要ext前缀了。ext属性支持Project和Gradle对象。
def initGradle()
{
Properties pro=new Properties()
File profile=new File(rootDir.getAbsolutePath()+”/local.properties”)
pro.load(profile.newDataInputStream())
//操作外置属性
gradle.ext.api=pro.getProperty(‘sdk.api’)
println gradle.api //第二次使用不用ext
}
3.Task介绍
Task是Gradle的数据模型,不同的插件可以添加不同的Task。每一个Task都需要和一个Project关联。
Task.mytask //新建Task的名字
Task.myTask{configure.closure}
Task.myType.doLast{task action}
Task.myTask{type:SomeType}
Task.myTask{type:SomeType}{configure closure}
一个task包含若干Action.所以 Task有doFirst 和 doLast两个函数.用来表示先执行和最后执行的action。action就是一个闭包。
Task创建时可以指定Type,通过type:名字表达.新建的Task对象会从那个基类Task派生。举个例子,Copy是Gradle中的一个类。Task myTask(type:Copy)的时候,创建的Task就是一个Copy Task。
使用task myTask{xxx} 花括号一个闭包。导致gradle创建这个Task后,返回用户之前,执行闭包中的内容。
使用task myTask《《{xxx} 创建一个Task对象,同时把闭包做一个action加到action队列中,并告诉Task最后在执行这个闭包
《《(表示 doLast)