Gradle系列学习:Gradle的简介、常用命令和生命周期

发布于 2021-1-15 14:55
浏览
0收藏

一 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系列学习:Gradle的简介、常用命令和生命周期-开源基础软件社区
二 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便会为我们构建好我们的安卓工程。整个构建的过程分成了三个部分:
3.1 初始化构建

Gradle系列学习:Gradle的简介、常用命令和生命周期-开源基础软件社区

上图是一个常见的多组件工程的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对象。
想更多地了解这两个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官方提供了以下方法:文档

Gradle系列学习:Gradle的简介、常用命令和生命周期-开源基础软件社区Gradle执行流程中上述方法的执行顺序如下:

Gradle系列学习:Gradle的简介、常用命令和生命周期-开源基础软件社区代码示例:

/**
 * 配置阶段开始前的监听回调
 */
this.beforeEvaluate {
    println '配置阶段执行前'
}
 
/**
 * 配置阶段后的监听回调
 */
this.afterEvaluate {
    println '配置阶段执行后'
}
 
/**
 * gradle执行完毕后的回调
 */
this.gradle.buildFinished {
    println '执行阶段完成后'
}
 
 
//等同于 beforeEvaluate
this.gradle.beforeProject {
 
}
 
//等同于 afterEvaluate
this.gradle.afterProject {
    println '配置阶段执行完毕'
}

 

收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐