Android---Gradle 构建问题解析

news2024/11/26 8:40:36

想必做 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.coloradmin.cn/o/1217057.html

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

相关文章

Android BitmapFactory.decodeResource读取原始图片装载成原始宽高Bitmap,Kotlin

Android BitmapFactory.decodeResource读取原始图片装载成原始宽高Bitmap,Kotlin fun getOriginalBitmap(resId: Int): Bitmap {val options BitmapFactory.Options()options.inJustDecodeBounds true //只解析原始图片的宽高,不decode原始文件装载到内…

C语言--字符串详解(多角度分析,什么是字符串?字符串如何存储?字符串如何应用?字符串常用的库函数有哪些?)

目录 一、前言 💦什么是字符串 💦字符串如何存储? 二、字符串常量和字符数组 💦字符串常量 ✨什么是字符串常量? ✨字符串常量与指针 💦字符数组 ✨字符数组的应用 💦字符串常量与字符数组的…

Nginx 修改server_name后无法访问

问题: 在nginx.conf配置中, server_name 为 localhost 时可以正常访问,但改成自定义的域名后无法访问 解决方法: - Window系统 修改本地hosts文件,一般路径在:C:\Windows\System32\drivers\etc\hosts 在文件最后…

数据库系统概述之数据库分类

你用过或者了解的数据库都有哪些? 数据库最新统计数量约404个(https://db-engines.com/en/ranking) 排名前20的数据库管理系统: 未完待续,喜欢的点赞收藏转发,如有疑问,点击链接加入群聊【信创…

python实现梯度距离平方反比法GIDS

1 梯度距离平方反比法 梯度距离平方反比法(gradient plus inverse distance squared (GIDS))由Nalder和Wein于1988年提出,是一种考虑了气象要素随经纬度和海拔高度变化的反距离权重法,其空间插值计算公式如下: 式中: z z z 表示代…

【C++】数组中出现次数超过一半的数字

代码&#xff1a; class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型vector * return int整型*/int MoreThanHalfNum_Solution(vector<int>& numbers) {int …

基于ssm+vue员工工资管理系统

基于ssmvue员工工资管理系统 摘要 随着信息技术的不断发展&#xff0c;各行各业对于高效管理和利用数据的需求也日益增长。员工工资管理系统作为企业管理中的一个重要组成部分&#xff0c;对于实现工资信息的精确计算、及时发放和有效管理具有重要意义。本文基于SSM&#xff08…

程序员导航站

探路者 hello.alluniverse.vip 开发者导航 - Pro Developer网站导航 探路者是一款极简导航工具&#xff0c;致力于收录的每个站点都有其独特的作用。同时支持自定义导航&#xff0c;让用户快速实现个性化的导航站点。 特性概述 免费ChatGPT 装机必备 开发工具 Git精选项目 …

Unity 代码控制Text文本换行

Unity 要通过代码控制Text文本换行&#xff0c;实现方法比较简单&#xff0c;无论是传统的Text&#xff0c;还是TMP文本&#xff0c;都是通过在字符串需要换行的地方加上换行符【\n】。 不过在Text属性栏中要确保设置自动换行模式&#xff1a; 如传统的设置如图&#xff1a; …

【AI视野·今日CV 计算机视觉论文速览 第278期】Mon, 30 Oct 2023

AI视野今日CS.CV 计算机视觉论文速览 Mon, 30 Oct 2023 Totally 50 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Image Clustering Conditioned on Text Criteria Authors Sehyun Kwon, Jaeseung Park, Minkyu Kim, Jaewoong Cho, Ernest…

Linux - 文件系统

前言 文件系统 我们先来看两个例子&#xff1a; 这个程序输出&#xff1a; 此时的输出也满足的我们预期。 我们也可以把 程序执行结果&#xff0c;输出重定向到 一个文件当中: 当我们在代码的结尾处&#xff0c;创建了子进程&#xff0c;那么输出应该还是和上述是一样的&…

【打卡】牛客网:

自己写的&#xff1a; 虽然题目要求了排序&#xff0c;但是我没排序也可以通过。 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param num int整型vector * return int整型vector<vec…

Java8Stream快速使用

将List集合存入流中 List<String> list new ArrayList<>();list.add("张一");list.add("张二");list.add("张三");list.add("李四");list.add("赵五");list.add("张六");list.add("王八"…

腾讯云新客户优惠服务器88元/年,540元/3年,另有5年优惠服务器

在选择云服务器时&#xff0c;首先需要考虑的是性能与配置是否与自己的需求相匹配。对于小型网站或者个人博客&#xff0c;轻量应用服务器是一个不错的选择。腾讯云双十一活动中&#xff0c;2核2G轻量应用服务器的活动优惠价为88元/年&#xff0c;2核4G轻量应用服务器的活动优惠…

运行游戏“找不到XINPUTI_3.dll无法继续执行代码,总共有五种解决方案

xinput1_3.dll是Windows操作系统中的一款动态链接库&#xff08;DLL&#xff09;文件&#xff0c;主要作用是为DirectX输入提供支持。DirectX是微软推出的一套多媒体应用程序开发接口&#xff0c;广泛应用于游戏、多媒体制作等领域。xinput1_3.dll文件包含了许多与输入设备相关…

java学习part04

1.进制 计算机底层都是二进制&#xff0c;输出统一十进制 2.算符 3.逻辑算符 4.位运算符 38-变量与运算符-位运算符的使用_哔哩哔哩_bilibili 5.条件运算符

【C++面向对象】14. 命名空间

文章目录 【 1. 命名空间的定义 】【 2. using 指令 】2.1 using 指定命名空间的全部2.2 using 指定命名空间的部分 【 3. 不连续的命名空间 】【 4. 嵌套的命名空间 】 问题的背景&#xff1a;假设这样一种情况&#xff0c;当一个班上有两个名叫 Zara 的学生时&#xff0c;为了…

YOLO改进系列之注意力机制(CoTAttention模型介绍)

简介 CoTAttention网络是一种用于多模态场景下的视觉问答&#xff08;Visual Question Answering&#xff0c;VQA&#xff09;任务的神经网络模型。它是在经典的注意力机制&#xff08;Attention Mechanism&#xff09;上进行了改进&#xff0c;能够自适应地对不同的视觉和语言…

黑客常用信息收集工具-02

信息收集是突破网络系统的第一步。黑客在进入目标主机之前,通常会使用一些专门的黑客工具对目标主机进行扫描,从扫描结果中分析这些计算机的弱点,从而确定进入目标主机的方法和手段。 接上文&#xff1a;黑客常用信息收集工具-01 tcpdump&#xff0c;tcpdump 可以抓所有层的数…

2013年11月10日 Go生态洞察:Go语言四周年回顾

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…