Gradle For Android(1)--使用Android
Gradle基础
build.gradle
是为了构建Android项目的脚本。Gradle构建脚本并不是使用传统的XML,而是基于Groovy的domain-specific language (DSL),而这种动态语言是为了JVM使用的。也就说明,我们可以使用任何一种基于JVM的语言来写自定义的插件。
Project与Task
每一个构建都至少会有一个Project。每个Project都包含一个或者多个Task。每个build.gradle
文件都代表着一个Project。Task都可以很简单的定义在这个build.gradle
文件中。
当初始化一个构建时,Gradle编译Project以及Task都依赖一个build文件。一个Task对象都是由一系列的Action对象列表组成,按照顺序执行。一个Action对象是一个可执行的代码块,就像Java中的函数。
构建生命周期
执行一个Gradle构建以最简单的形式来执行,仅仅只是执行各个依赖的Tasks中的Action。为了更简单的构建流程,BuildTool创建了一个DAG(Directed Acyclic Graph)动态模型的工作流。
这也就意味着,所有的Task都只会是一个接着一个,而不会重复执行。一旦一个Task已经被执行了之后,它将不会再被调用。没有依赖的任务总是会被优先执行。依赖关系的图(The Dependency Graph)是在生成配置阶段的时候被确定的。
一个Gradle构建会有三个阶段:
- 初始化:该阶段会生成Project对象。如果现在有多个Module的话,每一个都会有自己的
build.gradle
文件,多个Project对象都会被创建。 - 配置:在这个阶段,build脚本会被执行,创建并且为每一个创建的Project对象配置所有的任务。
- 执行:这个阶段就是Gradle决定哪些Task会被执行。而这些要被执行的Task取决于开始执行之前所传递的参数以及它的目录。
Build配置文件
为了配置一个Project,总会存在一个build.gradle
的脚本文件。该脚本文件中的部分配置如下:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
这是一个真实的build脚本配置。在repositories
的块中,jcenter()
作为代码仓库的依赖。JCenter是一个预配置的不需要其他配置的Maven仓库。这个仓库中提供了很多Gradle的服务,并且它也很容易把你本地以及远程的仓库添加到这个仓库中。
这个build脚本也定义了一个Android Build Tools的依赖(depencencies),通过classpath
的Maven Artifact提供了Android Plugin的来源。Android Plugin提供了构建以及测试的所有东西,每一个Android Project都需要通过:
apply plugin: 'com.android.application'
来应用Android Plugin。Plugin通常用来集成了Gradle的build脚本能力。应用一个Plugin到Project使得编译脚本可以去定义Properties,并且使用已经定义在这个Plugin中的Tasks。
如果要build一个Library,则需要使用
apply 'com.android. library'
。Library和Application的插件不能同时存在于一个Module中,否则会编译出错,一个Module可以是Library,也可以是Application,但是不能同时存在。
当使用Android插件的时候,Android中指定的值能够非常简便的进行配置。以下的代码块可以在插件中定义,并且应用到每一个Project中。
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
}
只有compileSdkVersion
以及buildToolsVersion
属性会被应用。最好使用最高版本的Android API作为编译版本。还有其他的更多属性后续再介绍。
使用Gradle Wrapper
使用Gradle Wrapper是一个避免问题并且可以使得构建可以重用的好方法。
Gradle Wrapper在Windows上提供了一个Batch文件,而在其他的操作系统上提供了一个Shell脚本。当执行这个脚本时,Required版本的Gradle会被下载,然后自动的开始构建。而这个方案是开发者以及自动化系统需要这个构建任务可以直接执行这个Wrapper,而不用关心剩下的工作。这种方案不需要在机器上手动的安装正确的Gradle版本。因此,推荐将wrapper文件添加到VCS(版本控制管理)中。
执行Gradle Wrapper文件与执行Gradle一致,只需要在Mac或者Linux上执行gradlew命令(而不是gradle命令),Windows上执行gradlew.bat即可。
将Gradle下载完成,并且配置到环境变量后,在项目中创建build.gradle
文件
task wrapper(type: Wrapper) {
gradleVersion = '2.4'
}
在通过gradle wrapper --gradle-version 2.4
命令执行过后,项目中生成多个文件:
myapp/
├── gradlew
├── gradlew.bat
└── gradle/wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
Gradle Wrapper有三部分:
- 一个Batch文件,或者一个gradlew的shell脚本
- 一个Jar包:供Batch以及Shell脚本使用的
- 一个Properties文件
其中Properties文件中会存有
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
也可以通过修改distributionUrl
中的版本来使用自定义的Gradle
执行基础的Build任务
在Terminal中,进入Project的目录,并且使用gradlew tasks
将会打印出来一系列的可用的Task列表。如果添加了--all
的参数,会打印出来每个任务的依赖关系。
如果需要打包一个Debug版本的包,则可以使用gradlew assembleDebug
执行任务。默认会在MyApp/app/build/outputs/apk
路径中保存Apk。
还有三个其他的基本Task:
- check:执行所有的check任务,通常是用来执行那些Test任务的
- build:执行assemble以及check任务
- clean:清理Project的output目录