Gradle是一款优秀的构建系统工具,它的DSL(领域特定语言)基于Groovy实现,可以方便地通过代码控制这些DSL来达到构建的目的。
注:执行gradle命令时,默认加载当前目录下的build.gradle文件,亦可以通过-b 指定要加载的执行文件,如: gradlew -b ./app/build.gradle assemble
Gradle常用基础
1、记得使用帮助
(1)查看所有可执行的任务(Tasks)
1 | gradlew tasks |
Gradle会以分组的方式列出task列表,比如构建类的 assemable,帮助类的 help等
1 | ------------------------------------------------------------ |
(2)Gradle Help任务
gradle内置的help任务,可以了解每一个Task的使用帮助,用法是gradlew help --task <taskName>
如:gradlew help --task assemable
2、强制刷新依赖
1 | gradlew --refresh-dependencies assemable |
3、多任务执行
只需按顺序以空格分开即可,如gradlew clean jar
,先执行clean再执行生成jar
4、自定义属性
自定义属性具有更广泛的作用域,可以跨Project,跨Task访问。只要能访问这些属性所属的对象,那么这些属性就可以被访问到。
1 | apply plugin: "java" |
5、任务的禁用和开启
任务禁用时,当执行到该任务,会skip掉
1 | task task1{ |
6、任务的onlyif 断言
任务有一个onlyIf方法,接收一个闭包作为参数,如果该闭包返回true,则该任务执行,否则跳过
以键值对的形式添加属性:-PK=V,中间不能有空格 ,如:
gradle -Pbuild_apps=shoufa build
1 | final String BUILD_APPS_ALL="all"; |
7、脚本即代码,代码也是脚本
虽然Gradle是个脚本文件,但写的依旧是代码,Groovy是兼容Java的,能灵活实现很多功能。如,给生成的apk以当前时间命名:
1 | def buildTime(){ |
Groovy基础
1、字符串
单引号和双引号都能定义字符串。区别在于,单引号表示纯粹的字符串常量,而双引号具有运算能力。 如:
1 | def name = "John" |
一个美元符号紧接着一对花括号,花括号里放表达式,如${name}
,当只有一个变量时,可以省略花括号,如$name
;
2、集合
(1)List
1 | def nums = [1,2,3,4] //定义arrayList |
(2)Map
1 | def map = ['width':1024,'height':768] //定义map |
(3)方法
- 括号是可以忽略的
1 | method1(2,3) // |
- return 是可以不写的,最后一句代码作为其返回值
1 | def method2(int a,int b){ |
- 代码块/方法是可以作为参数传递的
1 | //呆板写法 |
- JavaBean,可以很容易地访问和修改属性值,而不用通过getter/setter,因Groovy内部已帮我们搞定好。
1 | def Person p = new Person() |
- 闭包委托 Groovy的闭包有thisObject、owner和delegate三个属性,一般是thisObject>owner>delegate,但可以修改delegate。一般指定delegate为当前it,这样就可以在闭包内对该it进行配置,或调用其方法。
1 | task delegate{ |
Gradle 插件
1、Java Gradle 的sourceSets常用属性
sourceSet,即源代码集合(Android的buildTypes和这个类似),用来描述和管理源代码和资源存放等功能。提供有sourceSets{}闭包放配置和生成sourceSet,如:
1 | sourceSets{ |
SourceSet常用属性:
属性名 | 类型 | 描述 |
---|---|---|
name | String | 只读,如,main |
java | SourceDirectorySet | 该源集的java源文件 |
java.srcDirs | Set | 该源集的java源文件所在目录 |
resources | SourceDirectorySet | 该源集的资源文件 |
resources.srcDirs | Set | 该源集的资源文件的所在目录 |
output.classesDir | File | 该源集编译后的class文件目录 |
output.resourcesDir | File | 编译后生成的资源目录 |
compileClassPath | FileCollection | 编译该源集时所需的classPath |
2、Android Gradle插件分类和三个sourceSet
Android Gradle插件的分类是根据Anroid工程的属性分类的,在Android中,有3类:
- App应用工程插件id: com.android.application
- Library库工程插件id: com.android.library
- Test测试工程插件id: com.android.test
注:src目录下的androidTest,main,test分别是3个sourceSet,分别对应,Android单元测试代码,Android app主代码和资源,普通单元测试代码。 在main中,特有AndroidManifest.xml和res这两个Android特有的,用于描述Android App 配置和资源文件。