Gradle与Makefile构建工具的对比

简介:

随着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'
}





本文转自 Jhuster 51CTO博客,原文链接:http://blog.51cto.com/ticktick/1688586,如需转载请自行联系原作者

相关文章
|
4月前
|
IDE Java Maven
Maven或Gradle:构建工具的使用和配置等知识讲解梳理
Maven或Gradle:构建工具的使用和配置等知识讲解梳理
74 1
|
9月前
|
缓存 数据可视化 Java
Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?
Gradle 作为官方主推的构建系统,目前已经深度应用于 Android 的多个技术体系中,例如组件化开发、产物构建、单元测试等。可见,要成为 Android 高级工程师 Gradle 是必须掌握的知识点。
121 0
Gradle 构建工具 #5 又冲突了!如何理解依赖冲突与版本决议?
|
11月前
|
Java 大数据 Linux
大数据基本开发工具的构建工具的Gradle
在大数据开发过程中,构建工具是必不可少的。Gradle是一种基于Apache Maven和Apache Ant的自动化构建工具,广泛应用于Java、Scala和Kotlin等编程语言的项目构建。本文将介绍Gradle的特点、安装和使用方法。
76 0
|
12月前
|
存储 自然语言处理 IDE
Bazel 与 Gradle 构建工具差异对比
Bazel和Gradle强调构建体验的不同方面。在某种程度上,它们的侧重点是互斥的——Gradle对灵活性和非突出性的要求对它的构建结构进行了限制,而Bazel对可靠性和性能的要求产生了强制不可协商的限制。
187 0
|
Java Scala Maven
gradle构建工具的使用
gradle是构建工具,类似于ant和maven,也许目前maven还是主流,但是gradle却是综合了ant和maven的优点,发展速度很快,所以很有必要了解一下。
gradle构建工具的使用
|
XML 缓存 搜索推荐
Gradle构建工具极简教程
Gradle构建工具极简教程
294 0
Gradle构建工具极简教程
|
XML IDE Java
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
239 0
【Groovy】Gradle 构建工具 ( 自动下载并配置构建环境 | 提供 API 扩展与开发工具集成 | 内置 Maven 和 Ivy 依赖管理 | 使用 Groovy 编写构建脚本 )
|
XML Java Maven
【Groovy】构建工具 ( 构建工具引入 | Gradle 构建工具作用 | 传统的依赖管理 )
【Groovy】构建工具 ( 构建工具引入 | Gradle 构建工具作用 | 传统的依赖管理 )
126 0
|
Ubuntu Java Apache
Maven官宣:干掉Maven和Gradle!推出更强更快更牛逼的新一代构建工具,炸裂!
相信作为Java开发者的你早已经受够了maven的编译缓慢,但是又由于历史包袱、使用习惯等问题暂时切换不了其他更快的构建工具,这里笔者将给你介绍一款更快的maven——maven-mvnd。
Maven官宣:干掉Maven和Gradle!推出更强更快更牛逼的新一代构建工具,炸裂!
|
Java Maven
更快的Maven构建工具mvnd和Gradle哪个性能更好?(5)
更快的Maven构建工具mvnd和Gradle哪个性能更好?(5)
210 0
更快的Maven构建工具mvnd和Gradle哪个性能更好?(5)