https://docs.gradle.org/current/userguide/userguide.html
Gradle是以Groovy为基础的构建工具
Android Studio 构建过程
1.读取setting.gradle,按照里面的project,进行构建
2.依次读取里面modle的build.gradle 进行初始化,创建依赖关系
一:Gradle介绍
Gradle是一个基于JVM的构建工具,它提供了:
- 像Ant一样,通用灵活的构建工具
- 可以切换的,基于约定的构建框架
- 强大的多工程构建支持
- 基于Apache Ivy的强大的依赖管理
- 支持maven, Ivy仓库
- 支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件。
- 对Ant的任务做了很好的集成
- 基于Groovy,build脚本使用Groovy编写
- 有广泛的领域模型支持构建
Gradle 概述
1,基于声明和基于约定的构建。
2,依赖型的编程语言。
3,可以结构化构建,易于维护和理解。
4,有高级的API允许你在构建执行的整个过程当中,对它的核心进行监视,或者是配置它的行为。
5,有良好的扩展性。有增量构建功能来克服性能瓶颈问题。
6,多项目构建的支持。
7,多种方式的依赖管理。
8,是第一个构建集成工具。集成了Ant, maven的功能。
9,易于移值。
10,脚本采用Groovy编写,易于维护。
11,通过Gradle Wrapper允许你在没有安装Gradle的机器上进行Gradle构建。
12,自由,开源。
二:why groovy -- 主要用于java plugin
4.1. Prerequisites先决条件
Gradle依赖于JDK,需要已经安装好5.0(包括)以上的版本。虽然Gradle是基于Groovy配置的,但是不需要安装Groovy,它自带了。如果你已经安装了Groovy,没有关系,它会忽略掉的。
Gradle会在Path路径寻找JDK,找到哪个版本就用哪个版本。你自己可以用 java -version
来检查你的Java版本。你也可以设置JAVA_HOME
环境变量指明已安装和期望使用的是哪个JDK。
4.2. Download下载
可以到这个地方下载Gradle的发行版:Gradle web site.
4.3. Unpacking解压
Gradle发行版是一个ZIP包。包括以下及部分:
-
二进制文件
-
用户手册,HTML和PDF的
-
DSL引用指南。
-
API文档,包括Javadoc和Groovydoc.
-
丰富的例子,包括用户手册中的例子和其他完整的复杂的例子,你可以从简单的开始看。
-
二进制源码。这只是用来引用的,如果你要自己构建Gradle需要去下载源码发行版。详情到这来看吧:Gradle web site.
4.4. Environment variables环境变量
要运行Gradle,需要让PATH变量包含 *
GRADLE_HOME*/bin
. 仅此而已吗,足够了。
4.5. Running and testing your installation测试安装
可以通过
gradle
命令行运行Gradle。要看Gradle是否正确安装了,用
gradle -v
最简单了。输出是Gradle的版本还有其他一些环境配置信息。如果你看到的显示版本根本不是你自己下载的,哼哼,撞墙去吧。
4.6. JVM options JVM选项
你可以通过环境变量设置虚拟机选项,使用
GRADLE_OPTS
或者
JAVA_OPTS
就行,或者一起上吧。
JAVA_OPTS一般的是给很用应用使用的。比如设置HTTP代理使用JAVA_OPTS,而设置内存选项使用
GRADLE_OPTS。你可以在
gradle
或
gradlew
脚本的开头设置这些变量。
下载安装
临时设置path
echo $PATH
或者export PATH=PATH:/XXX
设置path
http://blog.csdn.net/witsmakemen/article/details/7831631
使用Android studio 自带Gradle
gradle -v----检查版本
gradle tasks ----显示全部任务
gradle -q taskname ---执行任务
依赖,依赖的task 可以先定义后声明
<<是doLast的别名
task 属性
task myTask {
ext.myProperty = }
task printTaskProperties << {
println myTask.myProperty
}
6.10 使用ant 任务
ant task 是Gradle第一个使用人群,Gradle 通过简单的依赖为Ant提供整合,Gradle是ant构建的船
使用ant从Gradle比用ant读取xml文件更方便
6.12允许定义默认的task
gradle -q ---就会执行默认task,不用指定
6.13.
gradle有配置阶段和执行阶段
在配置阶段之后,gradle知道所有要执行的task,gradle提供一个hook 去利用这个信息
一个用例,用于检查是否发布任务是要执行的任务之一。根据这一点,可以将不同的值分配给一些变量。
在下面的示例中,在不同的值中执行分配和释放任务的结果。
第七章7,java quickstart
apply plugin 'java'
gradle 希望发现产品源码在 src/main/java下 测试代码在src/test/java 下
src/main/resources 将被包括在JAR 文件中
java plugin为项目添加了用于构建的一些人物(这些都是Project 的方法)
gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs
Some other useful tasks are:
-
clean
-
删除build目录,移出所有构建文件
-
assemble(组装)
-
编译和打包你的代码,但是不运行unit tests ,也运行插件的构建(其他插件添加更多的工件到这个任务。例如,如果你用 War插件,这个任务也构建WAR文件)
check
编译和测试你的代码,其他插件和更多
- Compiles and tests your code. Other plugins add more checks to this task. For example, if you use the
checkstyle
plugin, this task will also run Checkstyle against your source code.
通常一个项目需要依赖额外的jar文件,为了指像向其他的jar,我们需要告诉gradle去哪了找到他们
repositories {
jcenter() 是指定存储库的网址的快捷方式。Gradle支持远程和本地库。
}
添加系统测试
test{
systemProperties 'property': 'value'
}
添加测试url:
11.using the Gradle Command-Line
task compile<<{
println}
task (:)<<{
println }
task (:[,])<<{
println }
task (:[,])<<{
println }</pre>
11.1多任务执行
gradle dist test<
特点:相同任务只会被执行一次。
11.2
gradle dist -x test
执行除了test其他的任务
11.3发生故障时继续执行
为了发现尽可能多的失败在一个构建执行,您可以使用——继续选项
正常是不会让其继续执行的例如,测试将不会运行如果有测试代码编译失败,因为测试任务将取决于编译任务(直接或间接)
11.4 任务名字缩写
gradle di
11.6 列出项目 任务
gradle -q projects
gradle -q tasks
gradle -q tasks --all 可以获得更多的信息
。。。。。。
13.1. The Gradle build language构建语言
Gradle提供了一种“领域专用语言”(domain specific language) 或者 DSL对构建进行描述。这种语言基于Groovy,并加入了其他特性使得描述更简单。
13.2. The Project API
在第七章Chapter 7, Java Quickstart 我们以apply()
方法为例做了描述。咦,这个方法哪来的?当时我们说脚本定义了工程,对于每一个工程Gradle会创建一个 Project
型的实例并将该对象实例和构建脚本进行关联。当构建脚本执行时会配置这个对象:
Getting help writing build scripts
嗨嗨别忘了构建脚本是Groovy代码,用的是Gradle API。而Project
接口就是你最先要了解的访问Gradle API的工具。所以要了解什么标签可用,就得去看Project
接口的文档.
-
脚本中调用的任何方法如果在基本中无定义,都委托给Project对象。
-
属性的访问同上。
咱们试着访问name属性看看
。
Example 13.1. Accessing property of the Project object
build.gradle
println name
println project.name
Output of gradle -q check
gradle -q check
projectApi
projectApi
哇唔,俩println
语句都打出了同一个属性。前者是自动委托了Project对象,对于没在脚本里定义的属性施行。后者使用了工程命来关联``Project对象。
如果你定义的属性和Project的成员一样了,那就必须使用工程名进行界定了。
13.2.1. Standard project properties标准属性
Project对象提供了几个标准属性,下面列出了一些常用的:
Table 13.1. Project Properties
| Name | Type | Default Value |
| project
| Project
| The Project
instance |
| name
| String
| The name of the project directory. |
| path
| String
| The absolute path of the project. |
| description
| String
| A description for the project. |
| projectDir
| File
| The directory containing the build script. |
| buildDir
| File
| *
projectDir*/build
|
| group
| Object
| unspecified
|
| version
| Object
| unspecified
|
| ant
| AntBuilder
| An AntBuilder
instance |
13.3. The Script API
脚本执行的时候Gradle会把它编译进实现了 Script
接口的一个类中,这样接口中的属性和方法都能直接使用了。
13.4. Declaring variables声明变量
可是声明两种变量:局部变量和额外属性。
13.4.1. Local variables局部变量
使用 def
关键字声明局部变量,它们只能在声明域中访问。局部变量在Groovy中就有。
<a name="localVariables" style="color: rgb(0, 102, 0); text-decoration: underline;"></a>
Example 13.2. Using local variables
build.gradle
def dest = task copy(type: Copy) {
from
into dest
}
13.4.2. Extra properties额外属性
Gradle域模型中的增强对象都有额外的用户定义属性。这包括但不限于工程、任务、资源集等。通过ext属性可以增加、读取、改变额外属性。也可以使用ext块增加多个额外属性。
Example 13.3. Using extra properties
build.gradle
apply plugin: ext {
springVersion =
emailNotification = }
sourceSets.all { ext.purpose = null }
sourceSets {
main {
purpose =
}
test {
purpose =
}
plugin {
purpose =
}
}
task printProperties << {
println springVersion
println emailNotification
sourceSets.matching { it.purpose == }.each { println it.name }
}
Output of gradle -q printProperties
gradle -q printProperties
3.1.0.RELEASE
build@master.org
main
plugin
上例中用 ext
块增加了两个额外属性。另外通过设置ext.purpose为null为每个资源集增加了purpose属性。一旦属性被增加就可以像预定义属性一样访问。
通过要求严格语法,Gradle会在尝试访问不存在是属性命时立即失败。额外属性可以从任何域访问,父工程的额外属性也能被子工程访问。
更多关于额外属性访问: ExtraPropertiesExtension
.
13.5. Some Groovy basics 基本Groovy入门
Groovy提供了大量特性来创建DSL,Gradle就利用了这一点。
13.5.1. Groovy JDK
Groovy给JVM类增加了大量好用的方法。比如 Iterable
有一个 each
方法,可以迭代访问元素:
Example 13.4. Groovy JDK methods
build.gradle
configurations.runtime.each { File f -> println f }
详细请看 http://groovy.codehaus.org/groovy-jdk/
13.5.2. Property accessors属性访问符
Groovy会自动给属性增加 getter或 setter 方法.
Example 13.5. Property accessors
build.gradle
println project.buildDir
println getProject().getBuildDir()project.buildDir = getProject().setBuildDir()
13.5.3. Optional parentheses on method calls括号可有可无
方法的括号在调用时不需要写
Example 13.6. Method call without parentheses
build.gradle
test.systemProperty , test.systemProperty(, )
13.5.4. List and map literals迭代
Groovy提供了定义 List
和Map的快捷方法:
Example 13.7. List and map literals
build.gradle
test.includes = [, ]
List<String> list = ArrayList<String>()
list.add()
list.add()
test.includes = listapply plugin: Map<String, String> map = HashMap<String, String>()
map.put(, )
apply(map)
13.5.5. Closures as the last parameter in a method闭包作末参数
Gradle DSL随处使用闭包,闭包的概念见here。如果方法的最后一个参数是闭包,则可以把闭包后置 :
Example 13.8. Closure as method parameter
build.gradle
repositories {
println }
repositories() { println }
repositories({ println })
13.5.6. Closure delegate闭包委托
每个闭包都有一个delegate
对象,Groovy使用它来查找闭包的非局部变量和引用。Gradle以此来配置闭包,给闭包添加delegate对象。
Example 13.9. Closure delegates
build.gradle
dependencies {
assert delegate == project.dependencies
compile()
delegate.compile()
}
14.More about Tasks
第六章讲了基础用法,这章讲一些样式的变化
定义Task的不同样式
task hello<<{}
task (hello)<<{}
task "hello"<<{}
task(copy, type: Copy) {
from(file())
into(buildDir)
}?????</pre>
task.creat(name: 'hello'){}
添加task 到集合,可以看TaskContainer API
14.2 定位任务
定义了任务需要去定位,知道任务在哪里也就是代表,每个项目的属性,用任务名字作为属性名字
task hello
println hello.name
println project.hello.name
println task.hello.name
println task['hello'].name
project() {
task hello
}
task hello
println tasks.getByPath().path
println tasks.getByPath().path
println tasks.getByPath().path
println tasks.getByPath().path
14.3 配置任务
task myCopy(type:Copy)
me:myCopy extends Copy
创建一个没有行为的copy task ,可以使用apicopy 去配置,有不同的方法可以实现相同的配置
这个任务名字 myCopy type Copy,我们可以声明多个任务相同的type 不同的名字
你会发现这给了你一个很大的力量来实现跨所有任务的一个特定类型的横切关注点。
Copy myCopy = task(myCopy,type: Copy)
myCopy.form 'resources'
myCopy.into 'target'
myCopy.include('/.txt','/.xml','*/.properties')
这是一种简单的java中配置的objects的方法,但是上下文重复,并不利于阅读
下面是我们经常使用的方法:
task myCopy(type: Copy)
myCopy{
form 'resources'
into 'target'
include('**/*.txt','**/*.xml','**/*.properties')
}
myCopy 是tasks.getByname的简写
task copy(type: Copy) {
from
into
include(, , )
}
14.4 为task 添加依赖
这有一些方法去为任务添加依赖,在6.5中讲了使用task的名字,任务的名字可以指向在相同project中的task,或其他项目中的,只向其它项目中的,需要加the path of project
etc:add projectA:taskX to projectB:taskY
project() {
task taskX(dependsOn: ) << {
println
}
}
project() {
task taskY << {
println
}
}
除了用 name 还可以用object
task taskX << {
println }
task taskY << {
println }
taskX.dependsOn taskY
还可以用闭包
task taskX << {
println }
taskX.dependsOn {
tasks.findAll { task -> task.name.startsWith() }
}
task lib1 << {
println }
task lib2 << {
println }
task notALib << {
println }
更多看task API
14.5任务执行顺序????
14.6添加描述为task
task copy(type: Copy) {
description
from
into
include(, , )
}
14.8 跳跃执行任务
Finalizer tasks
类似try catch 中的finally
task taskX << {
println }
task taskY << {
println }
taskX.finalizedBy taskY
15.WorkingWithFiles
17.Logging
20.The Build Environment
20.1配置构建环境通过gardle.properties
包括介绍代理
39.The IDEA Plugin
51.The Gradle TestKit
58 the build Lifecycle
gradle 的核心,是基于依赖的编程语言,这意味着你可以定义任务之间的易依赖,gradle保证每个依赖任务的执行顺序,并且每个任务只被执行一次。
这些任务形成一个有向非循环图。建立这样的依赖关系图在任何任务执行之前,这是gradle的核心。
您的构建脚本配置这个依赖关系图。因此,他们是严格讲构建配置脚本。
58.1构建阶段
初始化
gradle支持单项目和多个项目的构建,Gradle决定哪些项目将参加建设,并创建一个为每个项目工程实例
配置:
在这个阶段中,项目对象被配置。所有项目的构建脚本都被执行。1.4介绍Gradle孵化选择功能配置需求。在这种模式下,配置相关的项目工具(见第59.1.1.1,“配置要求”)。
执行:
Gradle决定任务的子集,创建和配置阶段配置,要执行。子集通过任务名称参数传递的工具命令和当前目录确定。Gradle然后执行每个选定的任务。
58.2 设置文件
除了构建文件,Gradle定义了设置文件,这个文件被指定叫 settings.gradle,以后的章节会介绍如何寻找设置文件。
59 multi-project builds
Android studio 常用的配置块
allprojects
{ }
配置本项目及其各子项目。此方法执行该项目及其子项目的给定闭包。目标项目被传递给闭包的委托。
Project
lifecycle
Task
一个项目本质上是一个task的集合,每个任务的执行工作的一些基本件,如编译的类,或运行单元测试,或压缩war文件。
android test
不能自动执行,只能手动调用
connectedCheck
想法:希望自定义task 然后依赖这个任务实现自动调用,可是没有实现
结果会显示在app/build/reports/androidTests/...
一起打不同版本的包
android {
compileSdkVersion buildToolsVersion defaultConfig {
minSdkVersion targetSdkVersion }
buildTypes {
release {
proguardFiles (), }
}
productFlavors {
flavor1 {
applicationId }
flavor2 {
applicationId }
}
}
网友评论