Gradle命令详解

前面一节课中,我们介绍了 Gradle 的任务声明,任务依赖,Gradle 构建的顺序等。其实在文章中我们也提到了一些 Gradle 命令。本文我们将为大家介绍一下 Gradle 的命令,包括会将前面的命令使用做一个汇总。

1. 使用 Gradle 命令

使用 Gradle 命令就是我们在命令控制台输入 Gradle 命令,使用 Gradle 命令我们可以配置 Gradle 环境,也可以不用配置 Gradle 环境,下面我们看下具体的使用方法:

1.1 已经安装了Gradle环境

如果安装了 Gradle 环境变量的话,我们直接使用gradle [命令],检查有没有安装 Gradle 环境我们可以使用下面命令:

$ gradle -version

------------------------------------------------------------
Gradle 6.0.1
------------------------------------------------------------

Build time:   2019-11-18 20:25:01 UTC
Revision:     fad121066a68c4701acd362daf4287a7c309a0f5

Kotlin:       1.3.50
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          1.8.0_91 (Oracle Corporation 25.91-b14)
OS:           Mac OS X 10.14.5 x86_64

如果如上所示,输出 Gradle 版本则说明已经安装了 Gradle 环境,如果如下所示,则说明没有安装 Gradle 环境,关于 Gradle 环境变量的安装配置请看《构建自己的Gradle工程》

$ gradle -version
-bash: gradle: command not found

1.2 没有安装 Gradle 环境

我们前面提到过如果没有安装配置 Gradle 环境变量,我们可以使用gradlew命令。我们前面知道我们创建 Android 项目时默认会有两个脚本gradlew.bat[Windows平台]和gradlew[Linux和Unix平台]。这两个脚本里面预置了我们常用的一些命令。我们以clean命令为例:

//Windows系统
gradlew clean


//Linux系统或是Mac系统
./gradlew clean

2. Gradle 常用命令

2.1 使用 Gradle Wrapper

我们前面讲《Gradle Wrapper详解》的时候提到过我们如果要使用 Gradle Wrapper 的话可以使用命令

$ gradlew wrapper --gradle-version 6.0.1

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1s
1 actionable task: 1 up-to-date

2.2 查看项目的任务依赖

要查看项目的依赖关系图,我们可以运行以下命令:

$ gradle dependencies
......省略部分输出.......
kaptTestRelease
\--- org.jetbrains.kotlin:kotlin-annotation-processing-gradle:1.2.51
     +--- org.jetbrains.kotlin:kotlin-stdlib:1.2.51
     |    +--- org.jetbrains.kotlin:kotlin-stdlib-common:1.2.51
     |    \--- org.jetbrains:annotations:13.0
     \--- org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.51
          +--- org.jetbrains.kotlin:kotlin-stdlib:1.2.51 (*)
          \--- org.jetbrains.kotlin:kotlin-script-runtime:1.2.51

lintChecks - Configuration to apply external lint check jar
No dependencies
......省略部分输出.......

运行该命令后我们可以在控制台看到项目的整体依赖关系和各个模块的依赖关系图,如上面的部分输出所示。

Tips:上面我们运行的命令输出的是整个项目的依赖,有时候我们只需要查查看当前 module 的依赖,那么我们怎么查查看呢?如下,我们输入gradle [module_name]:dependencies,例如我们想要查看 app 模块的依赖,我们可以执行如下命令:

//查看APP模块的依赖
$ gradle app:dependencies

2.3 排除某些任务

前面我么讲了 Gradle 的任务,我们可以用-x选项去排除一个任务。我们在build.gradle中定义的task mTest,我们如果想要跳过mTest,可以用以下的命令:

//buid.gradle中定义的Task,mTest
task mTest{
    doLast{
        println "这是测试Task"
    }
}

//在控制台执行命令排除
$ gradle clean build -x mTest

2.4 分析项目构建

在 Gradle 中内置了对项目分析的支持,我们平时如果遇到构建的性能问题,比如我们构建时间长,想要查看每个任务构建时间,我们可以使用这个命令[--profile build]来生成项目的配置文件报告,报告会以文件形式生成在 build/reports/ 目录下,如下所示:

$ gradle --profile build

> Task :app:lint
Ran lint on variant release: 15 issues found
Ran lint on variant debug: 15 issues found
Wrote HTML report to file:///Users/leiqi/branch/MyApplication/app/build/reports/lint-results.html
Wrote XML report to file:///Users/leiqi/branch/MyApplication/app/build/reports/lint-results.xml

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 9s
51 actionable tasks: 1 executed, 50 up-to-date

See the profiling report at: file:///Users/leiqi/TZYJ/branch/MyApplication/build/reports/profile/profile-2020-02-14-15-14-17.html
A fine-grained performance profile is available: use the --scan option.

我们看到控制台它会输出已生成 HTML 格式和 XML 格式的文档。我们可以看下 reports 文件夹

图片描述
我们在浏览器中,大家打开该文件就可以看到具体的任务耗时了,如下图:

图片描述

2.5 查看 Gradle 的 Task

我们在开发过程中有时候难免会要查看 Gradle 构建有哪些任务,那么我们就可以使用下面的命令来查看:

$ gradle task

> Task :tasks

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Android tasks
-------------
androidDependencies - Displays the Android dependencies of the project.
signingReport - Displays the signing info for the base and test modules
sourceSets - Prints out all the source sets defined in this project.

Build tasks
-----------
assemble - Assemble main outputs for all the variants.
assembleAndroidTest - Assembles all the Test applications.
build - Assembles and tests this project.
.........省略部分任务..............

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.

Cleanup tasks
-------------
lintFix - Runs lint on all variants and applies any safe suggestions to the source code.
.........省略部分任务..............

我们可以看到这个命令执行后会输出输出各种任务。

Tips: 我们看到这个很多,其实该命令输出的不是所有的命令,要查看项目构建的所有命令,我们需要执行的时候 后面加上 --all如下:

$ gradle task -all

2.6 使用 Gradle 命令来打 Android 包

我们在开发中经常是点击 run 按钮来执行编译并打包的,这样打出来的包是 Debug 包,供我们开发者来开发调试的,但是我们上线或是提交测试的时候我们需要提交的是 Release 包。下面我们就来看下我们如何使用 Gradle 命令来打包。

// 编译并打Debug包
$ gradle assembleDebug
// 编译app module 并打Debug包
$ gradlew install app:assembleDebug
// 编译并打Release的包
# gradle assembleRelease
// 编译并打Release包并安装
$ gradle installRelease
// 卸载Release包
$ gradle uninstallRelease

以上是我总结的我们平时开发中打包最常用的几个命令。

2.7 exlude 排除依赖包中的部分类

我们开发中,可能大家或多或少都会遇到 jar 包冲突的问题,有时候两个 jar 包不同,但是里面有两个类的包名路径是一摸一样的。这样我们就需要排除掉某个包中的重复的类,这时候就需要用的 exclude 命令,如下我们就以排除这个hibernate包中的类为例子。

compile('org.hibernate:hibernate:3.1') {
    //以artifact name来排除出
    exclude module: 'cglib'
    //通过group name来排除
    exclude group: 'org.jmock'
}

3. 小结

这一篇文章我们主要是学习了,我们日常开发中会用到的 Gradle 的一些命令。可能有同学会问,我们为什么要了解 Gradle 命令?我们平时直接使用工具编译不就好了。当然我们可以通过 AS 等编译工具来编译,其实 AS 的编译按钮也是在执行 Gradle 命令,有时候为了更好的提高我们的开发效率为我们节省时间。我们就需要用到 Gradle 的命令去排查问题。还有一个就是我们了解 Gradle 命令有助于我们后面 Gradle 运用在组件化,插件化,编译自己的 Gradle 插件等方面。