Gradle介绍与使用

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

 

本文分两大部分:第一部分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!'

    }

}

 

特别说明 等同的代码如下:

task helloA {

    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项目有两个概念,projecttask, Project为一个项目,Task为一次构建任务中的一个个别任务,Task是隶属与project的,每次build可以有多个project. Gradlemodule为单位来管理project.

Gradle中每个待编译的工程都是一个Project(每个工程的build.gradle对应一个Project对象),每个Project在构建的时候都包含一系列Task,任务动作定义了一个最小的工作单元,可以定义依赖于其他任务、动作序列和执行条件。

每次构建(build)至少由一个project构成,一个project 由一到多个task构成。项目结构中的每个build.gradle文件代表一个project,在这编译脚本文件中可以定义一系列的tasktask 本质上又是由一组被顺序执行的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 Studiogradle

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] 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 Studio3.4.1项目中的gradle的文件

使用Android Studio3.4.1创建一个项目可以看到Android 视图项目结构显示,请注意图中箭头标识的扩展名为.gradle的文件:

 

在Project视图项目结构显示,请注意图中箭头标识的扩展名为.gradle的文件:

 

请注意图中箭头标识的扩展名为.gradle的文件,双击它可以打开浏览修改。

 

gradle插件版本配置位置:

 

gradle版本配置位置(在gradle-wrapper-propertiies中):

 

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提供了一个框架,这个框架有一些运行的机制可以让你完成编译,但是至于怎么编译是由插件决定的。还好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双击后的情况):

 

IDEA自带gradle,如果你有特殊需要,可以更改Gradle 版本。方法是:

File ->Settings

单击“Build,Execution,Deployment”,单击“Build Tools” ,单击“Gradle”,如图所示:

IntelliJ IDEA 允许您在创建或导入 Gradle 项目时使用不同的选项来配置 Gradle 版本。您可以使用默认的 Gradle 包装器,使用 Gradle 包装器作为任务,或配置本地Gradle 分配器。

 

 

 

★ Eclipsegradle

查看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项目配置文件说明:

(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'。

 

 

【另一种安装了gradle插件并使用的方法

使用菜单:Window ->Preferences

可参见:eclipse 配置gradle 详细教程

http://www.javashuo.com/article/p-vtlccope-kr.html

 

 

延展阅读

Gradle用户使用指南

https://www.jianshu.com/p/5255b100930e

Gradle 教程(Gradle User Manual)

https://docs.gradle.org/current/userguide/userguide.html