一 Gradle简介
1.1 gralde
Gradle是一个项目构建工具,它可以按照一定的规则把一堆目录和文件关联起来,自动化地构建从而形成一个项目。AndroidStudio的build就是通过Gradle来实现的。
构建工具的发展历史简约回顾:很久之前我们用ant来自动化打包安卓,但jar包依赖问题处理起来很麻烦。于是有了maven,它除了自动化打包外,还可以自动下载对应的jar包依赖,但maven逻辑死板,定制麻烦。gradle兼顾两者之长,脚本灵活,成为现在安卓官方的自动化构建工具。
Gradle版本举例:gradle-6.1.1-all.zip。它通常位于:项目主目录 gradle 文件夹->wrapper->gradle-wrapper.properties。
Android Studio 的自动化构建以 Gradle 为基础,并且 ,Android Gradle 插件添加了几项专用于构建 Android 应用的功能。
Gradle版本可以在 Android Studio 的 File > Project Structure > Project 菜单中指定 ,也可以通过在 gradle/wrapper/gradle-wrapper.properties
文件中指定。以下示例在 gradle-wrapper.properties
文件中将 Gradle 的版本设置为 6.1.1。
...
distributionUrl = https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
...
1.2 Gradle插件
Gradle插件是针对Gradle发行版和Android SDK Build Tools封装的一个工具,主要有两大功能:
- 调用Gradle本身的代码和批处理工具来构建项目
- 调用Android SDK的编译、打包功能
Gradle插件版本可在 Android Studio 的 File > Project Structure > Project 菜单中可指定,也可以在顶级 build.gradle
文件中进行指定。该指定的插件版本将用于在相应 Android Studio 项目中构建的所有模块。以下示例从项目的build.gradle
文件中将插件的版本设置为 4.0.1:
buildscript {
repositories {
// Gradle 4.1 and higher include support for Google's Maven repo using
// the google() method. And you need to include this repo to download
// Android Gradle plugin 3.0.0 or higher.
google()
...
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
}
}
Gradle插件会有版本号,每个版本号又对应有一个或一些 Gradle发行版本(一般是限定一个最低版本)。下表列出了各个 Android Gradle 插件版本所需的 Gradle 版本。为了获得最佳性能,您应使用 Gradle 和插件这两者的最新版本:
插件版本 | 所需的 Gradle 版本 |
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
1.5.0 | 2.2.1 - 2.13 |
2.0.0 - 2.1.2 | 2.10 - 2.13 |
2.1.3 - 2.2.3 | 2.14.1+ |
2.3.0+ | 3.3+ |
3.0.0+ | 4.1+ |
3.1.0+ | 4.4+ |
3.2.0 - 3.2.1 | 4.6+ |
3.3.0 - 3.3.3 | 4.10.1+ |
3.4.0 - 3.4.3 | 5.1.1+ |
3.5.0 - 3.5.4 | 5.4.1+ |
3.6.0 - 3.6.4 | 5.6.4+ |
4.0.0+ | 6.1.1+ |
4.1.0+ | 6.5+ |
二 Android中常见的Gradle 命令
2.1 Gradle 查询命令
查看主要任务
./gradlew tasks
查看所有任务,包括缓存任务等等
./gradlew tasks --all
2.2 Gradle 执行命令
执行某个module [moduleName] 的某个任务[TaskName]
./gradlew :moduleName:taskName
2.3 Gradle 快速构建命令
Gradle的快速构建命令来替代 IDE 的可视化构建操作,如我们最常用的 clean、build 等等。
查看构建版本
./gradlew -v
清除 build 文件夹
./gradlew clean
检查依赖并编译打包,注意:build 命令会把 debug、release 环境的包都构建出来。
./gradlew build
编译并安装 debug 包
./gradlew installDebug
编译并打印日志
./gradlew build --info
编译并输出性能报告,性能报告一般在构建工程根目录 build/reports/profile 下
./gradlew build --profile
调试模式构建并打印堆栈日志
./gradlew build --info --debug --stacktrace
强制更新最新依赖,清除构建后再构建
./gradlew clean build --refresh-dependencies
编译并打 Debug 包
./gradlew assembleDebug
# 简化版命令,取各个单词的首字母
./gradlew aD
编译并打 Release 的包
./gradlew assembleRelease
# 简化版命令,取各个单词的首字母
./gradlew aR
2.4 Gradle 安装命令
Release 模式打包并安装
./gradlew installRelease
卸载 Release 模式包
./gradlew uninstallRelease
debug release 模式全部渠道打包
./gradlew assemble
2.5 Gradle 查看包依赖命令
查看项目根目录下的依赖
./gradlew dependencies
查看 app 模块下的依赖
./gradlew app:dependencies
查看 app 模块下包含 implementation 关键字的依赖项目
./gradlew app:dependencies --configuration implementation
三 :gradle生命周期
在点击Android Studio右上角的大象图标(Snyc Project with Gradle Files),gralde便会为我们构建好我们的安卓工程。正如官网所说,gradle构建流程总共为三个阶段:初始化构建阶段、配置阶段、执行阶段。
3.1 初始化构建阶段
上图是一个常见的多组件工程的Gradle Scripts,以该工程的gradle构建为例。
在点击Android Studio右上角的大象图标(Snyc Project with Gradle Files)后,gradle会为settings.gadle文件创建一个Settings对象,读取和执行settings.gadle文件中的所有配置代码:
include ':app',
':client',
':mars-core-release',
':emojilibrary',
':imagepicker',
':avenginekit',
':push',
':lvb',
':beauty',
':AliyunVideoCommon',
':AliyunPlayerBase',
':AliyunLiveShiftPlayer'
include ':lib_base_code'
Settings对象,会根据settings.gadle文件中包含的所有Project项目,去寻找其对应的build.gradle文件,并依此创建具有层次关系的Project对象。
Settings的官方文档地址
Project的官方文档地址
想更多地了解这两个Interface,可以去官网进一步学习,在此不赘述。
流程总结:
点击构建(Snyc Project with Gradle Files),gradle会根据settings.gadle文件创建对应的Settings对象,名称就是包含settings.gradle文件的目录名,该对象根据settings.gradle文件中include:Project自动为根项目创建Porject对象,Project对象和build.gradle文件一一对应。
3.2 配置构建
执行所有project的build.gradle文件中的配置代码,下载三方,依赖,构建Task的依赖关系图。构建Task的依赖关系图是Gradle的核心。
3.3 执行构建
根据任务命令以及参数,确定要执行的任务子集,并执行。对多项目而言,每次执行任务,都需要执行前面的初始化和包含的所有项目的配置。
build.gradle中,编写代码如下可得到对应log
3.4 hook
我们有时需要在Project或Task执行的某阶段做业务处理,此时就需要hook,Gradle官方提供了以下方法:文档
| 在settings.gradle被加载和解析时调用 |
| 当settings.gradle包含的项目的project实例都被创建但是还未被解析时调用 |
| 当每一个Project实例被解析之前调用,注意是解析,这时Project已经被创建了 |
| 当每一个Project实例被解析之后调用,注意是解析,这时Project已经被创建了 |
| 当所有的Project实例都被解析后调用 |
| 当构建开始前调用 |
| 当构建结束后调用 |
| 在setting.gradle 被加载和解析之前调用 |
| 当Tasks关系依赖图创建成功时 |
| 当Task执行前调用 |
| 当Task执行后调用 |
Gradle执行流程中上述方法的执行顺序如下:
代码示例:
/**
* 配置阶段开始前的监听回调
*/
this.beforeEvaluate {
println '配置阶段执行前'
}
/**
* 配置阶段后的监听回调
*/
this.afterEvaluate {
println '配置阶段执行后'
}
/**
* gradle执行完毕后的回调
*/
this.gradle.buildFinished {
println '执行阶段完成后'
}
//等同于 beforeEvaluate
this.gradle.beforeProject {
}
//等同于 afterEvaluate
this.gradle.afterProject {
println '配置阶段执行完毕'
}
参考文献:
gradle
Gradle总结-生命周期
深度探索 Gradle 自动化构建技术(一、Gradle 核心配置篇)
标签:生命周期,gradlew,gradle,Project,构建,build,常用命令,Gradle From: https://blog.51cto.com/u_12853553/5896538