Gradle入门之基础概念
Gradle是什么
Gradle是一款开源的自动化构建工具,可以灵活的构建任何类型软件(基本上),比如我们日常开发所熟知的:
- Java的产物(.JAR)
- Android Application的产物(.APK)
- Android Library的产物(.AAR)
目前Gradle已经是Android官方首推的自动化构建工具线,也是我们开发当中最密不可分的工具了。它与历史上过去的Java的自动化构建工具(Ant,Maven)相比,主要的优势是:
- 高性能
- 高拓展性
Gradle核心概念
关于Gradle必须知道的几个核心概念:
Gradle是一款通用的构建工具,它基本上可以用于构建任意类型的软件
Gradle虽然是一款自动构建工具,但它本身并不限定构建方法、构建内容。通过灵活的插件体系,Gradle能提供基于约定的构建能力而无需复杂的配置。Gradle的核心构建块是Task
Gradle的构建体系(构建流程)是通过定义task、分析task的依赖关系,构造一张task的有向无环图来完成的。
Gradle有着固定的编译阶段
Gradle按照下面三个阶段来评估(evaluate)和执行(execute)我们的编译脚本- 初始化阶段:包括构建环境的初始化,并在这个阶段确定需要参与构建的Project
- 配置阶段:构造task的有向无环图的关系
- 执行阶段:执行所有需要执行的task
Gradle提供灵活的构建拓展体系
- 自定义task的类型
- 自定义task的行为
- 自定义构建任务的属性
- 自定义约定规则
- 自定义构建块
Gradle的脚本是基于API运行的
Gradle的配置和执行
生命周期&hook
一张图整体理解Gradle的生命周期和配置执行流程
三种构建脚本
在整个构建体系中,总共有三种类型的构建脚本。同时前面关于Gradle的基础提到,Gradle是基于API执行的,实际上这三种脚本在运行时都对应着不同都对象实例,其关系如下:
- init.gradle -> Gradle实例
- settings.gradle -> Settings实例
- build.gradle -> Project实例
所以实际上我们在对应脚本里面添加的逻辑块实际上都是在调用着对应的实例的API.而且这三个实例构造的先后顺序也跟对应脚本的执行顺序一样。
1. Init script
这个脚本通常我们很少接触到,实际上这个脚本才是Gradle构建的起点。通常我们可以使用这个脚本来统一设定所有编译任务共享的一些逻辑或者是前置的初始化逻辑。
它的配置跟我们常用的build.gradle配置相似,只是由于它对应的是Gradle的实例,对应的配置逻辑都是调用Gradle的API。简单配置如下所示:
initscript{// 我们可以使用initscript配置块来添加这个脚本运行需要的一些依赖// 这个配置块是这个脚本最先被执行的逻辑(与代码放置顺序无关)repositories{}depdendencies{}
}
// 下面这些都是能通过Gradle实例,添加生命周期hook节点
buildStarted {}
beforeSettings {}
settingsEvaluated {}
beforeProject {}
afterProject {}
projectsLoaded {}
projectsEvaluated {}
buildFinished {}
taskGraph.whenReady {}
如果我们需要使用
init.gradle
可以在执行构建命令的时候通过--init-script
参数来制定对应的文件路径
2. Settings script
这个是我们平常接触到比较多的一个脚本。这个脚本执行在初始化阶段会被执行,确定需要参与构建的流程的project。(所以我们关于多模块编译或者多仓编译的配置就在这个里面)
rootProject.name = "gradle-test"
include("subProject")
includeBuild("path/to/other/project")
3. Build script
我们接触最多的配置脚本。每一个使用Gradle进行构建的工程或者模块根目录下都会有一个build.gradle
,同时对应着一个project的实例。
buildscript {// 我们可以使用buildscript配置块来添加这个脚本运行需要的一些依赖// 这个配置块是这个脚本最先被执行的逻辑(与代码放置顺序无关)repositories {}dependencies {}
}plugins {kotlin("jvm")
}// 下面的repositories和dependencies定义的是project构建所需要的依赖。注意跟buildscript配置块里面的逻辑区分
repositories {mavenCentral()
}dependencies {implementation(kotlin("stdlib"))
}
三个构建块
1. Project
2. Task
3. Properties
从属性读取方式看的话,可以将属性分为以下两种:
- System Properties
通过Sytem.getProperty()
的方式读取,部分org.gradle.xxx
打头的配置是由设置给运行gradle的jvm使用的。 - Project Properties
通过Project.getProperty()的方式读取
上面两种属性内容的传递方式主要有以下两种:
- 通过命令行定义
- 传递系统属性:使用-D.比如
-DsystemKey=systemValue
- 传递项目属性:使用-P或者-Dorg.gradle.project.XXX.比如
-PprojectKey=projectValue
,-Dorg.gradle.project.projectKey=projectValue
- 传递系统属性:使用-D.比如
- 通过gradle.properties定义
// garadle.properties
projectKey=projectValue // 定义项目属性
systemProp.systemKey=systemValue // 定义系统属性
Note:项目属性(Project Properties)还能通过ext配置块来定义
Note:Gradle中的属性是可继承的,意思是指在在父project中定义的属性,在子project中也能直接使用
参考
Gradle User Guide
Kotlin Gradle Plugin
Android Gradle Plugin
Kolin DSL Samples
Gradle入门之基础概念相关推荐
- 语音处理:音频入门之基础概念总结
语音处理:音频入门之基础概念总结 基本概念 语音增强 基本概念 过采样:超过音频本身实际带宽的采样率,如音频带宽12kHz,用96kHz采样属于过采样,用24kHz采样则较为合理.上采样,也属于过采样 ...
- CUDA入门:基础概念解析
1. GPU和CUDA GPU,即图形处理器,是一种专门用于处理图像和视频的计算设备.GPU由许多小型处理器核心组成,可以同时处理许多简单的计算任务.与CPU不同,GPU具有数千个处理器核心,这使得它 ...
- 工作流入门(基础概念篇)
1. 工作流管理系统基本概念 近两年随着电子商务环境不断演进(例如阿里巴巴的B2B电子商务平台),从原来支持企业内部单系统的业务流程.到企业内部应用.服务的集成,再进一步向企业与合作伙伴之间业务交互 ...
- 机器学习入门 笔记(二) 机器学习基础概念
第二章 机器学习基础概念 1.机器的数据 2.机器学习的主要任务 3.监督学习和非监督学习 4.批量.在线学习.参数.非参数学习 5.哲学思考 6.环境的搭建 1.机器的数据 我们以鸢尾花的数据为例. ...
- NumPy 快速入门系列:应用统计学基础概念、相关统计指标与NumPy的实现
NumPy 快速入门系列:应用统计学基础概念.相关统计指标与NumPy的实现 前言: 统计学导论: 统计学定义: 统计学分类: 统计学基本概念: 统计过程: 统计指标与NumPy: 用 Python ...
- 【JAVA学习】1、零基础入门Java 基础语法:概念、规则、格式
[JAVA学习]1.零基础入门Java 基础语法 前言 JAVA开发环境选择 Java 基础概念 Java 标识符 Java修饰符 基础代码模板框架 命名规则 基础规则 后端开发规则 代码格式 前言 ...
- Kafka教程(一)基础入门:基本概念、安装部署、运维监控、命令行使用
Kafka教程(一)基础入门 1.基本概念 背景 领英->Apache 分布式.消息发布订阅系统 角色 存储系统 消息系统 流处理平台-Kafka Streaming 特点 高吞吐.低延迟 cg ...
- 【大数据人工智能】统计学入门——数据科学领域最需要了解的统计学基础概念
目录 统计学入门--数据科学领域最需要了解的统计学基础概念 什么是统计学? 数据科学入门必备统计学概念 什么是对象? 什么是总体&
- Unity快速入门之一 3D基础概念、Camera、Canvas RenderMode的几种方式对比
最近要给公司的小伙伴做Unity入门,针对几个常用的知识进行快速入门介绍. Unity快速入门之一 3D基础概念.Camera.Canvas RenderMode的几种方式对比_翕翕堂 Unity快速 ...
最新文章
- win2000.win2003关闭端口详解--防黑必备
- 太多选择——企业如何选择合适的BI工具?
- searcherinder.exe
- java集合作为参数 传递的是_Java:数组和集合类作为参数传递时的差别
- PWA(Progressive Web App)入门系列:(四)Promise
- 服务器虚拟化的培训,VMware服务器虚拟化及桌面虚拟化培训.pptx
- Linux 基金会执行董事 Jim Zemlin:全球 Linux 的发展和生态
- 【协议】3、HTTP 协议入门
- [轉]PHP命名空间规则解析及高级功能
- ftp服务器默认文件夹,ftp服务器设置文件目录
- 匹配区县代码_北京各区县代码都是多少?
- 信息安全技术—实验三—PGP邮件加密软件的使用
- 引汉济渭:再续秦人治水神话_陕南赤子_新浪博客
- 金士顿U盘被写保护的解决方法(量产)
- 英语语法篇 - 时态
- 回顾并总结关于复利计算器的三次实验
- python conda安装
- vue页面接收后端传递数值后保留两位小数
- PHPMyWind支持Word导入
- 浅析uthash系列之User Guide(翻译)