Android---Gradle 构建问题解析

想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助,Android 工程师使用 Gradle 的门槛不算太高,基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改,就都能满足项目要求。但是,深入细致了解 Gradle 的基本知识,还是能帮助我们更优雅的实现项目配置工作。

有些场景 gradle 甚至能帮助我们完成一些业务上的需求,下面我们就来了解一下 gradle 那些需要掌握的基本知识

gradle Task

Task(任务)可以理解为 gradle 的执行单元,gradle 通过执行一个个 Task 来完成整个项目构建工作。

自定义 Task

我们可以在 build.gradle 中使用关键字 task 来自定义一个 Task。如下代码所示

task A{println 'this is task A'
}

上面定义了一个简单的 task A,然后同步 build.gradle ,可以看到下面的打印结果

从结果中可以看出,打印日志是在 gradle 的配置阶段执行的。

gradle 的构建生命周期包含三个部分:初始化阶段、配置阶段、执行阶段

在 task A 中添加 doFirst 闭包,如下所示

执行后打印结果如下所示

gradle 在运行期,会执行所有的 Task 配置语句,然后执行指定的 Task。

Task 之间可以存在依赖关系

gradle 中的 Task 可以通过 DependsOn 来指定依赖另一个 Task,如下所示

在 builid.gradle 中新加了一个 Task B,并通过 dependsOn 关键字指定 Task B 依赖于 task A,执行 task B,结果如下

可以看出,我们虽然只是执行的 task B,但是因为依赖关系的存在,task A 也会被执行。

gradle 会在配置 Configure 阶段,确定依赖关系,对于 Android 项目来说即为执行各个 module 下的 build.gradle 文件。这样各个 build.gradle 文件中的 task 依赖关系就被确认起来了。而这个依赖关系的确定就是在 Configuration 阶段。

gradle 自定义方法

我们可以在 build.gradle 中使用 def 关键字,自定义方法。比如一下代码中,自定义了 getData() 方法,并在 task 中使用此方法。

执行 my_task,结果如下

gradle project

在 android 中,每个 module 就对应一个 project。gradle 在编译时期会为每一个 project 创建一个 Project 对象用来构建项目。这一过程是在初始化阶段,通过解析 settings.gradle 中的配置来创建相应的 Project。

上图 settings.gradle 中导入了 3个 project,但是实际上还会有一个root project。如下所示

我们可以在 root project 中统筹管理子 project。

buildSrc 统筹依赖管理

随着项目越来越大,工程中的 module 越来越多,依赖的第三方库也越来越多。一般情况下,我们会在一个集中的地方统一管理这些三方库的版本。比如谷歌官方推荐的使用 ext 变量。在 root module 下的 build.gradle 中,使用 ext 集中声明各种第三方库的版本。如下所示

然后在子 module 中引用这些版本信息

但是,这种写法也有一些小瑕疵,不支持 AS 的自动补充功能,也无法使用代码自动跟踪。因此可以考虑使用 buildSrc。

buildSrc 是 Android 项目中一个比较特殊的 project,在 buildSrc 中可以编写 Groovy 语言。但是现在谷歌越来越推荐使用 Kotlin 来编写编译语句。

先在根目录下创建 buildSrc 目录。结果如下

注意,这个工程只能有一个并且名字必须为 buildSrc。创建好之后,在 buildSrc 中创建 build.gradle.kts 文件,并添加 kotlin 插件。

编译工程可能会报错,如下所示

只要添加 repositories{jcenter()} 厂库即可。

接下来在 buildSrc 中创建 src/main/java 目录,并在此目录下创建 Dependencies.kt(名字可以随便取)。Dependencies.kt 中创建两个 Object,分别用来管理项目中的版本信息和使用的依赖库。

我么可以在 Versions 中添加各种项目中可能引用到的版本

然后在 Deps 中引用 Versions 中的变量

最后,我们就可以在 module 中的 build.gradle 中直接使用 Deps 中的变量来声明依赖。比如在 app module 的 build.gradle 中添加如下依赖

下图中,使用 buildSrc 前后的对比。并且在使用 Deps 的过程中,Studio 会给出自动提示。

总结

本次主要介绍了 gradle 构建中的 Task 和 project。

Task 与大部分开发者的开发是最为紧密的,是 gradle 构建的基本单元。每次编译工程时,Android studio 会在控制台打印出执行的 task 名称。

project 对应项目中的 module,每个 module 中包含一个 build.gradle。每个 build.gradle 都会被 gradle 编译成 Project 字节码。在 build.gradle 中所写的所有逻辑,最终都会被映射成此 Project 字节码内的实现逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/152985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试题c/c++ --STL 算法与数据结构

1.6 STL 模板 模板底层实现:编译器会对函数模板进行两次编译, 在声明的地方对模板代码本身进行编译, 在调用的地方对参数替换后的代码进行编译。 模板传参分析 模板重载 vector 是动态空间, 随着元素的加入, 它的内…

Apache Airflow (十二) :PythonOperator

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

内网穿透的应用-如何在Docker中部署MinIO服务并结合内网穿透实现公网访问本地管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…

HTTPS流量抓包分析中出现无法加载key

HTTPS流量抓包分析(TLSv1.2),这篇文章分析的比较透彻,就不班门弄斧了 https://zhuanlan.zhihu.com/p/635420027 写个小问题:RSA密钥对话框加载rsa key文件的时候注意不要在中文目录下,否则会提示:“Enter the passwor…

单张图像3D重建:原理与PyTorch实现

近年来,深度学习(DL)在解决图像分类、目标检测、语义分割等 2D 图像任务方面表现出了出色的能力。DL 也不例外,在将其应用于 3D 图形问题方面也取得了巨大进展。 在这篇文章中,我们将探讨最近将深度学习扩展到单图像 3…

【MySql】13- 实践篇(十一)

文章目录 1. 自增主键为什么不是连续的?1.1 自增值保存在哪儿?1.2 自增值修改机制1.2.1 自增值的修改时机1.2.2 自增值为什么不能回退? 1.3 自增锁的优化1.3.1 自增锁设计历史 2. Insert语句为何很多锁?2.1 insert … select 语句2.2 insert 循环写入2…

以“防方视角”观Shiro反序列化漏洞

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自微信公众号“潇湘信安”,记录的某师傅如何发现、利用Shiro反序列化漏洞,又是怎样绕过火绒安全防护实现文件落地、…

BLIP-2:冻结现有视觉模型和大语言模型的预训练模型

Li J, Li D, Savarese S, et al. Blip-2: Bootstrapping language-image pre-training with frozen image encoders and large language models[J]. arXiv preprint arXiv:2301.12597, 2023. BLIP-2,是 BLIP 系列的第二篇,同样出自 Salesforce 公司&…

物流实时数仓:采集通道搭建

系列文章目录 物流实时数仓:环境搭建 文章目录 系列文章目录前言一、环境准备1.前置环境2.hbase安装1.上传并解压2.配置环境变量3.拷贝jar包4.编写配置文件5.分发配置文件 3.Redis安装1.安装需要的编译环境2.上传并解压文件3.编译安装4.后台访问 4.ClickHouse安装5…

OpenCvSharp从入门到实践-(01)认识OpenCvSharp开发环境搭建

目录 一、OpenCV 二、OpenCvSharp 三、OpenCvSharp开发环境搭建 四、下载 五、其他 一、OpenCV OpenCV是基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习函数库,支持Windows、Linux、Android和Mac OS操作系统。OpenCV由一系…

Oracle for Windows安装和配置——Oracle for Windows net配置

2.3. Oracle for Windows net配置 2.3.1. Oracle net配置 2.3.1.1. Oracle net简介 前述章节中,我们只是安装了数据库软件,创建了数据库,测试在服务器本地连接查询数据库。但还不能通过网络远程连接访问数据库,因为我们还没配置用来远程连接访问该数据库的组件Oracle ne…

【Linux】缓冲区+磁盘+动静态库

一、缓冲区 1、缓冲区的概念 缓冲区的本质就是一段用作缓存的内存。 2、缓冲区的意义 节省进程进行数据IO的时间。进程使用fwrite等函数把数据拷贝到缓冲区或者外设中。 3、缓冲区刷新策略 3.1、立即刷新(无缓冲)——ffush() 情况很少&#xff0c…

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)

目录 A、求全是字母的最小十六进制数 B、Excel表格组合 C、求满足条件的日期 D、 取数字 - 二分 (1)暴力 (2)二分 E、最大连通块 - bfs F、哪一天? G、信号覆盖 - bfs (1)bfs&#xf…

【前端学java】java中的日期操作(12)

往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 &#xff08…

使用Python的turtle模块绘制玫瑰花图案(含详细Python代码与注释)

1.1引言 turtle模块是Python的标准库之一,它提供了一个绘图板,让我们可以在屏幕上绘制各种图形。通过使用turtle,我们可以创建花朵、叶子、复杂的图案等等。本博客将介绍如何使用turtle模块实现绘制图形的过程,并展示最终结果。 …

创建一个用户test且使用testtab表空间及testtemp临时表空间并授予其权限,密码随意

文章目录 1、连接到数据库2、创建表空间3、创建用户4、授予权限5、测试 1、连接到数据库 sqlplus / as sysdba2、创建表空间 创建testtab表空间 CREATE TABLESPACE testtab DATAFILE /u01/app/oracle/oradata/orcl/testtab.dbf SIZE 50M AUTOEXTEND ON NEXT 5M MAXSIZE …

Unity中Shader法线贴图(下)理论篇

文章目录 前言一、采样出错的原因二、切线空间是什么?切线空间图解: 三、计算方式1、统一变换到切线空间下进行计算2、统一变换到世界空间下进行计算 四、一般统一变换到世界空间下的坐标进行计算1、求M^-1^2、求出n~w~ 前言 这篇文章,主要解…

[Android] Amazon 的 android 音视频开发文档

https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3https://developer.amazon.com/zh/docs/fire-tv/audio-video-synchronization.html#22-getplaybackheadposition-api-level-3

车载毫米波雷达行业发展1——概述

1.1 毫米波雷达定义及产品演进 1.1.1 毫米波雷达定义 毫米波雷达(mmWave Radar)是指工作在毫米波波段的雷达,其频域介于 30~300GHz,波长1~10mm。毫米波雷达稳定性高,抗干扰能力强,可穿透雾、烟、灰尘环境&#xff0…

Java基础-----StringBuffer和StringBuilder

文章目录 1.StringBuffer1.1 构造方法1.2 常用方法 2.StringBuilder3.String、StringBuffer、StringBuilder的区别 1.StringBuffer 内容可变的字符串类,适应StringBuffer来对字符串的内容进行动态操作,不会产生额外的对象。StringBuffer在初始时&#x…