随着Android Studio的遍及,不断增加的Android开发者也要开端了解和学习Gradle这款强壮的代码构建东西了。咱们在学习和了解一项新事物的时分,最疾速的办法往往是与已知的事物进行比照,对于熟悉Makefile编译机制的Linux程序员而言,知道和掌握Gradle最佳的办法莫过于比照它们之间的区别了,这篇文章不准备详细介绍Gradle的方方面面,而是希望经过与Makefile的比照帮助Gradle初学者更疾速地了解Gradle的基础和原理。
Makefile是一种办理和编译 Linux C/C++ 项目的东西,而Gradle也是一种代码构建东西,只不过是对于Java言语的,它相同能够经过一些装备文件和脚正本完结代码的依靠、第三方库的引进、编译的主动化装备等功能。
首要说说Makefile,它是由一个个"规矩"构成,每个"规矩"都是由"方针"、"依靠"、"指令"构成, 一个最简略的Makefile如下所示:
1
2
3
4
5
6
7
8
9
.PHONY: clean
all: hello
hello: hello.c
gcc -o hello hello.c
clean:
rm hello
这儿有三个"方针",分别是: "all","hello","clean"
当履行"make"指令时,编译器会默许查找方针"all" ,假如没有"all"则会查找Makefile文件的第一个方针。本示例中有"all"方针,它依靠"hello"方针,因而编译器会转而先构建"hello"方针,构建前, 编译器会先检查"hello"方针是不是需求更新(经过判别"hello"文件与它所依靠的源文件"hello.c"的修正时刻),假如需求,则履行后边的指令,而需求编译的源文件则是经过手动或许相关函数的方法添加到编译指令的参数中去的。
这即是makefile最基地的构建思维,经过一个个"方针"、"依靠"、"指令"来完结悉数项目的关联和编译。那么,咱们也依据这一思维来看看Gradle是怎样完结的。
1. Gradle是怎样辨认源文件的 ?
Gradle是采取了一种"约好优于装备"的思维来完结这一点的,它经过"Plugin"来约好项目的方针和源文件的规划,例如: Java Plugin 界说的源文件规划如图所示:
wKioL1Xdnk2QXnWeAAEXQAiYhPc987.jpg
由该图能够很清楚地看到,Java Plugin 直接约好好了源文件的目录构造,在Gradle中,一般把这些源码目录的装备叫做"SourceSet",同理,Android供给的Android Plugin相同也界说了自个的源文件规划,还加入了如 jni, AndroidManifest.xml 等目录和文件。对于Gradle项目而言,需求在每个代码模块的"build.gradle"文件中界说运用哪一种Plugin, 例如:
1
2
3
4
5
6
7
8
//一般的Java项目
apply plugin: 'java'
//Android Application
apply plugin: 'com.android.application'
//Android Library
apply plugin: 'com.android.library'
2. Gradle是怎样辨认编译方针的 ?
在Gradle中,与Makefile的"方针"相对应的概念是"使命",即"task",Gradle的构建进程,即是履行一条一条"task"使命的进程, 相同,一个"task"也是能够依靠另一个"task"的,这么,经过这种依靠联系,就能够将悉数项目中各个"task"连接到一起了。
与Makefile中手写方针的方法不一样,Gradle将一切的"task"的界说悉数交给Plugin来完结,因为每一种工程类型(Java项目、Android项目等),其构建进程都是迥然不同的,因而为每一种类型的项目界说好了一种通用的Plugin,以后同类型的项目就能够直接运用该Plugin了,十分的灵活和便利。
当咱们在项目中履行"gradle build"指令时,能够看到该项目运用的Plugin详细界说了哪些"task",例如一个典型的Java Plugin界说的"task"如下所示:
1
2
3
4
5
6
7
8
9
10
11
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
当然,尽管同是Android类型的工程,但不一样的项目究竟还是有装备上的区别,因而,Gradle的Plugin中也能够界说和导出一些特定的"元素"用于传递用户自界说的装备信息,例如: Google供给的 "com.android.application"Plugin 就界说了一个"android"元素,开发者能够在build.gradle中装备该元素的细节,比方界说一些: "项目的ID"、"sdk的版本"、"是不是混杂"等等,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "com.jhuster.test"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0.0"
}
}
3. Gradle指令怎样用 ?
gradle指令与make指令相似,都是用来履行编译/整理使命的,make指令默许查找当时目录下的Makefile文件,而且开端构建指令参数中所指定的"方针",例如:
1
2
$make all
$make clean
相同,gradle指令也是相似的用法,例如:
1
2
3
4
$gradle build //构建和打包悉数项目
$gradle clean //清除之前的构建
$gradle test //履行测验
$gradle compileJava //编译java
4. Gradle是怎样引进第三方库的 ?
对于Makefile而言,通常需求将第三方库的源码下载下来,编译为库后,放入到工程目录下,然后修正Makefile文件,在gcc/g++的编译连接参数中引证该第三方库的,例如:
1
2
hello: hello.c
gcc -o hello hello.c -L/libs/foo.a
而Gradle则是经过build.grade文件中的dependencies来装备的,例如:
1
2
3
4
dependencies {
compile files('libs/foo.jar') //以jar的方法引证
compile project(':foo') //以library工程源码的方法引证
}
别的,Gradle还支撑相似Ubuntu软件源库房的方法来引证第三方库,开发者能够将自个的第三方库上传到一些支撑Gradle的基地库房中,这么,其他人就能够经过装备build.gradle直接完结对第三方库的引证了,代码构建的时分Gradle会主动完结第三方库的下载和连接。比照常用的两个个基地库房: jcenter,mavenCentral。
例如: 咱们引证jcenter库房的okhttp库,则build.gradle装备如下:
1
2
3
4
5
6
7
8
9
allprojects {
repositories {
jcenter()
}
}
dependencies {
compile 'com.squareup.okhttp:okhttp:2.4.0'
}
5. 小结
Gradle真的很强壮很灵活,它将最基地的构建规都则交给了Plugin来完结,这么,轻松完结了构建进程的通用性,开发者只需求重视事务逻辑,以及少量的装备即可完结主动化编译和布置的进程,比较于Linux手写makefile要便利许多。好了,对于Gradle和Makefile的简略比照就介绍到这儿了,最后引荐一个网站给大家 http://www.keymb.com/