Gradle介绍与使用
Gradle是一个用来管理编译构建流程的工具,它可以帮你管理项目中的依赖、编译、打包、部署、差异(不同的签名文件,不同的icon,不同的服务器地址),你可以定义满足自己需要的构建逻辑,写入到build.gradle中供日后复用。gradle免费开源。
gradle正是基于Groovy来实现的,Groovy是一种DSL(Domain Specific Languages)特定领域语言,这种构建语言基于 Groovy 中,并进行了一些补充,使其易于描述构建,一般只用在特定领域。Gradle 的 DSL 目前支持两种语言的格式,Groovy 和 Kotlin,Kotlin 格式的 DSL 是在 5.0 引入的。
Gradle环境必须依赖JDK与Groovy库,所以Gradle 需要安装 JDK。但因Gradle 自带了 Groovy 库,所以不需要安装 Groovy,Gradle 会忽略已经安装的 Groovy。
【DSL(Domain Specific Languages)
你可能已见过或用到过它而未明确意识到,从Windows里的ini配置文件, XML配置文件,到主流编程语言的正则表达式,SQL都算是。
关于DSL可参见:
DSL简介https://blog.csdn.net/u010278882/article/details/50554299
】
在Android Studio、IntelliJ IDEA中已集成了gradle,较新的Eclipse版本(如eclipse4.10.0)中也已集成了gradle。
本文分两大部分:第一部分Gralde安装与简单使用,第二部分gradle在Android Studio等中的应用入门。Gralde很难全面把握,牵扯的环节方面太多,初学时总觉得云里雾里的,后来我感觉从比较直观的感性认识入手,再逐步深入比较不错,本文是我学习笔记的再次总结,希望对新手有所帮助。万事开头难,对于新手,有了入门认识基础,再往下学挫败感将减少许多。特别声明,本文希望通过这两部分,对Gradle进行比较直观的介绍。
第一部分、Gralde安装与简单使用
Gradle 安装
首先要配置好JDK。关于这点参见他文。
【可以在cmd中通过 Java -version 验证是否安装了JDK】
访问官网,下载Gradle安装包
https://gradle.org/releases/?utm_source=hacpai.com
官方提供以下 2 种压缩包可供下载
binary-only (如果不需要源码、文档,选择下载这个压缩包就够了)
complete (包含文档及源码)
我下载的是gradle-6.0.1-bin.zip是压缩文件版,将其压缩文件解压到任意目录下,即可看到如下文件路径。
bin:该路径下存放了各种工具命令,常用的gradle命令就放在该路径下。
lib:该目录下包含了gradle的各种工具JAR包、gradle的依赖库。
下载完成后,解压到指定目录,
配置gradle环境变量:将 bin 目录添加到系统环境变量(配置gradle环境变量)。
将(跟据你的实际情况)D:\gradle-6.0.1\bin
放入系统环境变量path
在win10配置系统环境变量
右键此电脑,属性,高级系统设置,系统属性,在“系统变量”中,找到PATH,添加,参见下图:
验证 Gradle 是否安装成功
打开命令行工具输入以下命令
gradle -v 回车
看到类似输出,说明设置成功!
【特别提示:下载的版本要和jdk版本匹配,否者出现出错提示:
FAILURE: Build failed with an exception.
……】
在cmd中输入gradle -help 回车,可以了解gradle命令概述:
Gradle 脚本文件的扩展名.gradle
Gradle 脚本文件的例子
//创建一个名为buildA.gradle的文件
task helloA {
doLast {
println 'Hello world!'
}
}
【特别说明 等同的代码如下:
println 'Hello world!'
}
注意,gradle 5.0之前的版本,等同的代码还可这样:
task helloA << {
println 'Hello world!'
}
注意,<<已经过时了,可以通过降低gradle版本(比如4.10.1)运行
】
将上面代码,保存到d:\GradleDemo目录中,文件名buildA.gradle,
可以在cmd中,使用Gradle命令运行。
先介绍一下Gradle命令常用格式:
gradle taskName -q -b buildFile
其中
taskName是任务名(task name),上例中为helloA。
-q可选,q表示quiet模式,表示编译执行Gradle脚本的过程中,只输出必要的信息。
-b buildFileName 可选,用来指定构建文件名(build file name),上例中为buildA.gradle,如果文件名保存为build.gradle,且保存在当面目录下,可以省略-b buildFileName,否者不能省略。buildFileName可带路径,如:d:\dirA\fileA.gradle。
编译执行某个Project中的某个task:gradle -b Project名 Task名
【关于Gradle命令详细语法,参见:
Command-Line Interface
https://docs.gradle.org/current/userguide/command_line_interface.html
】
现在运行上面的例子
在cmd中输入 gradle hello -b d:\GradleDemo\buildA.gradle回车
参见下图:
Gradle项目有两个概念,project和task, Project为一个项目,Task为一次构建任务中的一个个别任务,Task是隶属与project的,每次build可以有多个project. Gradle以module为单位来管理project.
在Gradle中每个待编译的工程都是一个Project(每个工程的build.gradle对应一个Project对象),每个Project在构建的时候都包含一系列Task,任务动作定义了一个最小的工作单元,可以定义依赖于其他任务、动作序列和执行条件。
每次构建(build)至少由一个project构成,一个project 由一到多个task构成。项目结构中的每个build.gradle文件代表一个project,在这编译脚本文件中可以定义一系列的task;task 本质上又是由一组被顺序执行的Action`对象构成,Action其实是一段代码块,类似于Java中的方法。
task介绍
task,如其名:任务,gradle就是由一个一个任务来完成的。他其实也是一个类,有自己的属性,也可以"继承",甚至他还有自己的生命周期。
他的定义方式有很多,前面已演示过一个例子极其如何运行。
再举一例
task myTaskA{
def valueB = "我的测试"
println "valueB=" + valueB
5.times{ //5次的一个循环
println "it is: " + it //等价写成println "it is: $a"//$变量名,表示去取变量的值
}
}
保存为保存到d:\GradleDemo目录中,文件名testBuild.gradle
【注】
.times 和 it是Gradle的循环用关键字
println "it is: " + it /等价写成
println "it is: $a"//$变量名,表示去取变量的值
现在运行上面的例子
在cmd中输入 gradle myTaskA -q -b d:\GradleDemo\testBuild.gradle回车
参见下图:
在创建自定义插件时,您需要编写一个插件的实现。 Gradle实例化插件并使用Plugin.apply()方法调用插件实例。以下示例包含一个简单的CustomPluginTask插件示例:
apply plugin:CustomPlugin
class CustomPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.task('CustomPluginTask') {
doLast {
println "自定义简单插件测试"
}
}
}
}
保存为保存到d:\GradleDemo目录中,文件名testBuildPlugin.gradle
在cmd中输入 gradle CustomPluginTask -q -b d:\GradleDemo\testBuildPlugin.gradle 回车
参见下图:
上面的简单例子很简单,重点在于说明Gradle脚本的运行。
Gradle Wrapper
Gradle Wrapper称为Gradle包装器,是对Gradle的一层包装。为什么需要Gradle Wrapper呢?比如在一个开发团队中,如果每进来一个成员,都需要在计算机中安装Gradle,这个时候运行Gradle的环境和版本就会对构建结果带来不确定性。针对这个问题,Gradle提供了一个解决方案,那就是Gradle Wrapper,它是一个脚本,可以在计算机没有安装Gradle的情况下运行Gradle构建,并且能够指定Gradle的版本,开发人员可以快速启动并运行Gradle项目,而不必手动安装,这样就标准化了项目,从而提高了开发效率。AS在新建项目时会自带Gradle Wrapper,这也是我们很少去单独去下载安装Gradle的原因。Gradle Wrapper的工作流程如下图所示。
当使用Gradle Wrapper启动Gradle时,如果指定版本的Gradle没有被下载关联,会先从Gradle官方仓库下载该版本Gradle到用户本地,进行解包并执行批处理文件。后续的构建运行都会重用这个解包的运行时安装程序。
Gradle已经内置了Wrapper Task,执行Wrapper Task就可以在项目目录中生成Gradle Wrapper的目录文件。在项目根目录执行gradle wrapper就可以了。
例如,你已预先建立了目录d:\ABC2
在cmd中
输入cd /d d:\ABC2 回车(即按下Enter键)切换到目录d:\ABC2
输入gradle wrappe 回车
参见下图:
进入目录d:\ABC2可以看到:
可以简化示意为:
├── gradle │ └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew └── gradlew.bat |
每个文件的含义如下:
• gradle-wrapper.jar :包含Gradle运行时的逻辑代码。
• gradle-wrapper.properties :负责配置包装器运行时行为的属性文件,用来配置使用哪个版本的Gradle等属性。
• gradlew:Linux平台下,用于执行Gralde命令的包装器脚本。
• gradlew.bat:Windows平台下,用于执行Gralde命令的包装器脚本。
学习Gralde主要目的是配置编译构建流程。
第二部分、gradle在Android Studio等中的应用入门
下一步重点是学习gradle在Android Studio、IntelliJ IDEA、Eclipse中的应用。
★ Android Studio和gradle
Android Studio 是谷歌(Google)推出的一个Android集成开发工具,基于IntelliJ IDEA。基于Gradle的构建支持。
【注意,不要将Android Studio和IntelliJ IDEA混淆:
Android Studio只支持Android开发,是谷歌在IntelliJ IDEA社区版上剔除其他功能的一款专注Android开发的插件,可以说是弱化版的IntelliJ IDEA。
IntelliJ IDEA是JetBrains公司推出的Java集成开发环境,当然Android也是基于java的,IntelliJ IDEA除了支持Android开发,还支持JavaSE,Android,Groovy,Scale,HTML,CSS,PHP等语言的开发。】
Android Studio一个Android集成开发工具, 建立项目是基于Gradle的构建支持。
用Android Studio新建一个项目
启动Andriod Studio
单击“Start a new Andriod Studio project”
出现
这里,作为测试,选择Basic Activity , 点击Next
Name输入框中输入 MyAppTest
点击“Finish”,请耐心等待构建项目框架。
【如果你看到的视图不是这样的,请在左侧Project Exlorer中依次展开app -> res ->layout,再双击content_main.xml即可。】
至此,Android studio已(默认利用Gradle)创建一个简单Java项目。默认产生了一些文件,其中有两个文件:第一个是程序文件(mainactivity.java),第二个是.xml界面布局文件(activity_main.xml)。程序文件主要进行逻辑程序的编写,.xml界面布局文件相当于图形界面,我们可以进行一些组件(控件)的布局等操作,然后在程序文件中进行逻辑程序的编写和对组件(控件)的调用。参见下图:
你可以双击程序文件mainactivity.java,打开看看,在此就不图示了。
Android Studio 建立项目是基于Gradle构建的,请留意工程目录——是按约定【或称为默认规范】建立的——Gradle构建框架形成了,参见上图,重点看左侧区域。之后你就可以在此构建框架的基础上,编写应用代码实现具体功能了。
仔细观察分析,你可以直观的发现创建的工程目录遵从一定的规范,源文件、配置文件的位置(目录)遵从一定的规范,这是因为gradle插件在背后作用——gradle插件的默认设置起了作用——因为我们还没有直接改变gradle设置,至于如何改变gradle设置,及gradle设置语法,对于初学者,不要一开始就过于纠缠这些细节,在此,主要介绍利用gradle构建项目的框架,给出直观描述,为以后的深入认识学习奠定基础。
注意 [Android] Gradle插件和Gradle是有区别的。
Gradle 是项目自动化构建开源工具。
[Android] Gradle插件是Android Studio用于开发Android项目的gradle插件。
安装Android Studio后就已经帮我安装了Gradle插件,Gradle插件是独立于Android Studio运行的,它的更新是与Android Studio分开的。
查看Android Studio的Gradle、Android Gradle插件的版本
点击菜单File->-Project Structure
进入Project Structure界面之后,点击Project,如下图:
你可以在这里指定项目使用的Android Gradle Plugin和Gradle版本,当你指定的版本没有下载下来时,在你下次构建项目时会自动下载之。指定Gradle插件的版本的另一种方法,在build.gradle文件中classpath处,指定Gradle的版本的另一种方法,在gradle-wrapper.properties文件中distributionUrl处。本文后面还将提到。
【可参见文档Android Gradle plugin release notes(Android Gradle插件发行说明):https://developer.android.google.cn/studio/releases/gradle-plugin
】
Android Gradle Plugin 本质上就是 一个AS的插件,它一边调用 Gradle本身的代码和批处理工具来构建项目,一边调用Android SDK的编译、打包功能,从而让我们能够顺畅地在AS上进行开发。
Android Studio3.4.1项目中的gradle的文件
使用Android Studio3.4.1创建一个项目可以看到Android 视图项目结构显示,请注意图中箭头标识的扩展名为.gradle的文件:
在Project视图项目结构显示,请注意图中箭头标识的扩展名为.gradle的文件:
请注意图中箭头标识的扩展名为.gradle的文件,双击它可以打开浏览修改。
gradle插件版本配置位置:
可以在此指定Gradle插件的版本,在classpath处。
gradle版本配置位置(在gradle-wrapper-propertiies中):
可以在此指定Gradle的版本,在distributionUrl处。
Android Gradle 构建的补充说明
每次构建的执行本质上执行一系列的Task。某些Task可能依赖其他Task。哪些没有依赖的Task总会被最先执行,而且每个Task只会被执行一遍。每次构建的依赖关系是在构建的配置阶段确定的。
初学者往往有一个疑问,点击开build.gradle却没看见一个task,怎么回事?
你点击AndroidStudio右侧的一个Gradle按钮,会打开一个面板,内容差不多是这样的:
里面的每一个条目都是一个task,那这些task是哪来的呢?
一个是根目录下的 build.gradle 中的
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
参见下图:
dependencies {classpath ‘com.android.tools.build:gradle:3.5.2’}是Android Gradle编译插件的版本。
还一个是 app 目录下的 build.gradle 中的
apply plugin: 'com.android.application'
参见下图:
apply plugin: ‘com.android.application’是引入了Android的应用构建项目。
对此,就不深入了。【Gradle是Android Studio 默认的build 工具。使用Android Studio 新建一个项目后,默认会生成两个build.gradle 文件,一个Top-level build file(顶级build文件),一个Module级的。其中语句的比较详细解释可参见:
史上最全的Android build.gradle配置教程
https://www.jb51.net/article/145005.htm
还有另外一个文件settings.gradle。如果在当前项目中添加了一个新的 module ,就需要在settings.gradle 文件中包含这个新的module。】
总之,Gradle提供了一个框架,这个框架有一些运行的机制可以让你完成编译,但是至于怎么编译是由插件决定的。还好Google已经给我们写好了Android对应的Gradle工具,我们使用就可以了。
★ IntelliJ IDEA和gradle
我用的是IntelliJ IDEA 2019.2 x64。
idea自带gradle。
用IntelliJ IDEA创建gradle项目
在初始界面选择create new project或在菜单栏中选择File-->New-->projec
选择Gradle
然后单击“NEXT”:
GroupId是组名,通常用公司域名倒写如:com.xxx.xxx(和填写包名称类似),如果您打算在本地部署项目,则可以不填,这儿填的是cn.abc,ArtifactId标识为新项目的名称,这儿填的是testB,然后单击“NEXT”:
然后单击“Finish”,等待项目初始化,项目建好后,显示如下图(展开刚建立的项目testB:单击testB,再单击scr,找到build.gradle双击后的情况):
使用gradle建立项目,请留意工程目录——是按约定【或称为默认规范】建立的,——Gradle构建框架形成了,参见上图,重点看左侧区域。之后你就可以在此构建框架的基础上,编写应用代码实现具体功能了。
现在就可以创建一个测试java类——HiGradle:
工程下的 src用于存放代码。点击src展开,找到Java右击,操作参见下图:
输入类名后回车:
在代码编辑区输入如下测试代码:
public static void main(String args[])
{
System.out.println("Hi,gradle");
}
现在变成:
至此,已用IDEA和gradle创建一个简单Java项目。仔细观察分析,你可以直观的发现创建的工程目录遵从一定的规范,源文件、配置文件的位置(目录)遵从一定的规范,这是因为gradle插件在背后作用——gradle插件的默认设置起了作用——因为我们还没有直接改变gradle设置,至于如何改变gradle设置,及gradle设置语法,对于初学者,不要一开始就过于纠缠这些细节,在此,主要介绍利用gradle构建项目的框架,给出直观描述,为以后的深入认识学习奠定基础。
IDEA自带gradle,如果你有特殊需要,可以更改Gradle 版本。方法是:
File ->Settings
单击“Build,Execution,Deployment”,单击“Build Tools” ,单击“Gradle”,如图所示:
IntelliJ IDEA 允许您在创建或导入 Gradle 项目时使用不同的选项来配置 Gradle 版本。您可以使用默认的 Gradle 包装器,使用 Gradle 包装器作为任务,或配置本地Gradle 分配器。
查看Eclipse是否安装了gradle插件
在Eclipse中选择Help -> Eclipse Marketplace
出现如下对话框界面,单击Installe(已安装)选项卡,如果看到Buildship Gradle Integration 3.0说明已安装,参见下图:
若没有,单击Search(搜索)选项卡,在其find框中buildship点击Go,选择Gradle插件:Buildship Gradle Integration 3.0,然后单击其右边的Install安装,参见下图:
Eclipse中创建gradle项目
前提是Eclips安装了gradle插件
File -> Other 在出现的对话框中找到 Gradle -> Gradle Project,参见下图,并按图操作:
稍等一会,
使用gradle建立项目,请留意工程目录——是按约定【或称为默认规范】建立的,——Gradle构建框架形成了,参见上图,重点看左侧区域。之后你就可以在此构建框架的基础上,编写应用代码实现具体功能了。
【gradle项目配置文件说明:
(1)build.gradle
项目自动编译的时候要读取的配置文件,比如指定项目的依赖包等。
(2)gradle.properties
定义了一系列供build.gradle使用的常量。
(3)gradlew与gradlew.bat
gradlew为Linux下的shell脚本,gradlew.bat是Windows下的批处理文件。gradlew是gradle wrapper的缩写,也就是说它对gradle的命令进行了包装, 比如我们进入到指定Module目录并执行“gradlew.bat assemble”即可完成对当前Module的构建(Windows系统下)。
(4)settings.gradle
整个项目的管理,假如我们的项目包含了不只一个Module时,我们想要一次性构建所有Module以完成整个项目的构建,这时我们需要用到这个文件。比如我们的项目包含了ModuleA和ModuleB这两个模块,则这个文件中会包含这样的语句:include ':ModuleA', ':ModuleB'。
】
现在就可以创建一个测试java类——HiGradle:
工程下的 src用于存放代码。展开ABC项目,找到scr/main/java,右击,操作参见下图:
点击“Finish”按钮后:
输入如下测试代码
System.out.println("Hi,gradle");
至此,已用Eclipse和gradle创建一个简单Java项目。仔细观察分析,你可以直观的发现创建的工程目录遵从一定的规范,源文件、配置文件的位置(目录)遵从一定的规范,这是因为gradle插件在背后作用——gradle插件的默认设置起了作用——因为我们还没有直接改变gradle设置,至于如何改变gradle设置,及gradle设置语法,对于初学者,不要一开始就过于纠缠这些细节,在此,主要介绍利用gradle构建项目的框架,给出直观描述,为以后的深入认识学习奠定基础。
本文就到这里吧。
延展阅读:
Gradle用户使用指南
https://www.jianshu.com/p/5255b100930e
Gradle 教程(Gradle User Manual)
https://docs.gradle.org/current/userguide/userguide.html