前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Gradle Builds Everything —— Task 实例

Gradle Builds Everything —— Task 实例

作者头像
程序亦非猿
发布于 2019-11-23 00:42:14
发布于 2019-11-23 00:42:14
75200
代码可运行
举报
文章被收录于专栏:程序亦非猿程序亦非猿
运行总次数:0
代码可运行

本文开始讲述下 Task 是如何定义的。

为了方便,我们的语境分不开 GradleAndroidGradlePlugin,因此此处不脱离 Android环境来介绍 Gradle。我们在讲述任务依赖的时候,提到一个 Manager的东西,在这里,我们说到的是 AndroidGradlePlugin提供的 BuildableArtifactsHolder这个类。

一个 Task 如果有有意义的输出,且产物可能被其他的 Task 所使用的时候,我们可以往 BuildableArtifactsHolder注册我们的产物,注册方式有这么几种:

createBuildableArtifact/createDirectory/createArtifactFile

这些 api 需要传入创建文件的类型,文件的文件名,动作等,以 createArtifactFile的其中一种形式为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fun createArtifactFile(        artifactType: ArtifactType,        operationType: OperationType,        taskName: String,        fileName: String) : Provider<RegularFile>

artifactType 就是产物类型

operationType 是操作类型,可以是初始化(init),追加(append),或者变化(transform),区别如下:

  1. 如果指明了是 init,那么它之前不可以有任何针对相同产物类型的调用
  2. 如果指明了是 append,那么是追加相关的文件
  3. 如果指明了是 transform,那么就是替换当前的文件。

你可以根据你使用产物的目的来使用不同类型,因为返回值是一个 FileCollection (文件集合,不是文件夹的概念),如果调用的是 transform,你需要注意在 Configuration 阶段对于这些产物调用顺序的问题,如果 B.transform 在 A.transform 之后,那么获取最终产物的时候,就会取走 B 的结果。

BuildableArtifactsHolder 提供的 api 一般都已经让你传入了 taskName,就是让你告诉它,你所产生的产物由哪个任务生成。后续你去根据 artifactType 获取产物(FileCollection)的时候,它会检查这个任务是否执行,如果没有的话会先执行,这部分判断的逻辑由 FileCollection 的 builtBy 做到,由 Gradle 进行管理。

Task 的配置

以上,我们介绍了如何让 Task 的产物和 Task 本身产生一些关联,这种关联建立完成之后,可以看到 createArtifactFile 这个函数的返回值是 Provider<RegularFile>,这里代表了一个目的地,我们往这个文件里写入的产物即可;当然这里也可以创建文件夹同理,示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
task.outputFile =  variantScope.getArtifacts().createArtifactFile(                    InternalArtifactType.BUNDLE,                    BuildArtifactsHolder.OperationType.INITIAL,                    taskName,                    bundleName)

然后在 task 定义的地方:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Task {
 private Provider<RegularFile> outputFile;
 @OutputFile public Flie getOutputFile() {    return outputFile.get().asFile(); }
}

这样的话,gradle 会自动帮你创建这个文件,开发者需要的只是调用 getOutputFile()拿到 File然后写入即可。

Task 的联动

我们知道了 Task 产生一个文件的完整流程,我们该如何使用这个文件呢?我们在另外一个 Task 中,定义一下 input

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
task.input = variantScope.getArtifacts().getArtifactFiles(type); //这里的 type 和上面的type一样,比如 InternalArtifactType.BUNDLE

这个拿到是一个 BuildableArtifact 对象,它的声明如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface BuildableArtifact : Iterable<File>, Buildable, Supplier<FileCollection> {    val files : Set<File>    fun isEmpty() : Boolean}

可以使用 get()获取一个 FileCollection,当再次调用 FileCollection.getFiles()方法时,gradle 就会检查产生这个产物的 Task 是否已经执行,如果没有执行,就会先执行前面一个 Task

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序亦非猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Transform和Task之间有关?| Gradle
之前有个朋友在面总部的安卓岗的说被问了一些技术问题,感觉还是很有难度,而且也很有水平。感觉在总部的开发还是都很强的啊。
逮虾户
2020/10/15
1.5K0
Gradle 与 AGP 构建 API: 进一步完善您的插件!
欢迎阅读 MAD Skills 系列 之 Gradle 与 AGP 构建 API 的第三篇文章。在上一篇文章《Gradle 与 AGP 构建 API: 如何编写插件》中,您学习了如何编写您自己的插件,以及如何使用 Variants API。
Android 开发者
2022/03/25
6030
Gradle 与 AGP 构建 API: 进一步完善您的插件!
其实 Gradle Transform 就是个纸老虎
目前,使用 AGP Transform API 进行字节码插桩已经非常普遍了,例如 Booster、神策等框架中都有 Transform 的影子。Transform 听起来很高大上,其本质就是一个 Gradle Task。在这篇文章里,我将带你理解 Transform 的工作机制、使用方法和核心源码解析,并通过一个 Demo 帮助你融会贯通。
用户9995743
2022/09/26
1.1K0
其实 Gradle Transform 就是个纸老虎
深入探索 Android Gradle 插件的缓存配置
配置缓存是一个提升 IDE 和命令行构建速度的基础构建块。这是 Gradle 6.6 版本提供的一个高度实验性功能,它可以使构建系统记录一次任务的图谱信息,并在接下来的构建中进行复用,从而避免再一次配置整个工程。这一功能也是配置阶段改进的延续,这些改进中引入了 惰性配置 (lazy configuration),以避免在构建的配置阶段进行不必要的工作。这些改进对于快速迭代开发的重要性不言自明,而后者也是 Android Studio 团队所持续关注的一个用例。
Android 开发者
2020/11/16
2.4K0
深入探索 Android Gradle 插件的缓存配置
打通Android Gradle编译过程的任督二脉
本文主要是基于自己在工作当中的一些Android Gradle实践经验,对gradle相关知识做的一个简单总结和分享,希望对大家有帮助。 首先会讲Gradle大概的工作流程和实现原理,并以部分源码分析佐证。其中包括project中配置数据什么时候取,各个task的创建时机,如何自定义控制编译过程等。 然后着重会分析编译过程中class到dex这一步的具体过程,以及当初遇到的一些问题和解决方法。 主要工作流程 Gradle构建过程包括三个阶段: 初始化阶段 读取根工程中的setting.gradle中的inc
QQ音乐技术团队
2018/01/30
6.2K0
打通Android Gradle编译过程的任督二脉
【Android Gradle 插件】自定义 Gradle 任务 ⑬ ( DefaultTask 中的任务输入和输出属性 | TaskInputs 任务输入接口 | FileCollection )
DefaultTask 又继承了 AbstractTask 类 , 在 AbstractTask 类中 , 有 taskInputs 和 taskOutputs 两个成员变量 , 分别代表任务的 输入 和 输出 ;
韩曙亮
2023/03/30
1.3K0
【Android Gradle 插件】自定义 Gradle 任务 ⑬ ( DefaultTask 中的任务输入和输出属性 | TaskInputs 任务输入接口 | FileCollection )
从精准化测试看ASM在Android中的强势插入-Gradle插件
Gradle Plugin是我们在编译期修改代码的重要武器,也是我们精准化测试的核心组成部分。
用户1907613
2021/07/19
1.1K0
从精准化测试看ASM在Android中的强势插入-Gradle插件
使用新 Android Gradle 插件加速您的应用构建
自 2020 年底,Android Gradle 插件 (AGP) 已经开始使用新的版本号规则,其版本号将与 Gradle 主要版本号保持一致,因此 AGP 4.2 之后的版本为 7.0 (目前最新的版本为 7.2)。在更新 Android Studio 时,您可能会收到一并将 Gradle 更新为最新可用版本的提示。为了获得最佳性能,建议您使用 Gradle 和 Android Gradle 插件这两者的最新版本。Android Gradle 插件的 7.0 版本更新带来了许多实用的特性,本文将着重为您介绍其中的 Gradle 性能改进、配置缓存和插件扩展等方面的内容。
Android 开发者
2022/04/01
2.7K0
使用新 Android Gradle 插件加速您的应用构建
深入理解gradle中的task
在之前的文章中,我们讲到了如何使用gradle创建一个简单的task,以及task之间怎么依赖,甚至使用了程序来创建task。在本文中,我们会更加深入的去了解一下gradle中的task。
程序那些事
2021/02/15
4880
Flutter Android 工程结构及应用层编译源码深入分析
本文部分配图及源码最近基于 Flutter 2.2.3 版本进行了修正更新发布。目的是为了弄清 Flutter 在安卓端应用层的整个编译来龙去脉,以便编译过程中出任何问题都能做到心里有数,另一个目的是为了能够在应用层定制 Flutter 编译。全文比较长,图文并茂,由工程结构深入到源码解析。
工匠若水
2021/08/18
3.2K0
gradle中的增量构建
在我们使用的各种工具中,为了提升工作效率,总会使用到各种各样的缓存技术,比如说docker中的layer就是缓存了之前构建的image。在gradle中这种以task组合起来的构建工具也不例外,在gradle中,这种技术叫做增量构建。
程序那些事
2021/02/17
1.8K0
AndResGuard编译速度优化
当前项目内用了腾讯的AndResGuard对资源文件的大小进行了一次深度优化。AndResGuard负责将文件名,arsc文件和R文件也进行了一次混淆,能把整体的资源文件大小压缩。
逮虾户
2020/10/27
2.6K0
AndResGuard编译速度优化
用kotlin来开发一个cli工具 | 没用的技能+1
而在程序开发过程中,每个工程或者说公司也都需要一个脚手架工具。通过脚手架命令行的形式简化开发流程,避免发生一些人为的相对低级的问题,所以这个也就是为什么叫做脚手架的原因吧。
逮虾户
2022/12/10
1.3K0
用kotlin来开发一个cli工具 | 没用的技能+1
Gradle 中的Task
项目实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译 Java 源代码,拷贝文件, 打包 Jar 文件,甚至可以是执行一个系统命令。另外,一个 Task 可以读取和设置 Project 的 Property 以完成特定的操作。
鱼找水需要时间
2023/02/16
1.3K0
Gradle 中的Task
Gradle 与 AGP 构建 API: 如何编写插件
欢迎阅读 MAD Skills 系列 之 Gradle 与 AGP 构建 API 的第二篇文章。通过上篇文章《Gradle 与 AGP 构建 API: 配置您的构建文件》您已经了解 Gradle 的基础知识以及如何配置 Android Gradle Plugin。在本文中,您将学习如何通过编写您自己的插件来扩展您的构建。如果您更喜欢通过视频了解此内容,请在 此处 查看。
Android 开发者
2022/03/24
8460
Gradle 与 AGP 构建 API: 如何编写插件
Gradle+Groovy基础篇
在Java项目中,有两个主要的构建系统:Gradle和Maven。构建系统主要管理潜在的复杂依赖关系并正确编译项目。还可以将已编译的项目以及所有资源和源文件打包到.war或.jar文件中。对于简单的构建,Maven和Gradle之间的选择几乎是个人喜好之一,或者也许是公司CTO或技术经理的偏好。他们俩都是非常好的构建工具。但是,对于更复杂的项目,Gradle比Maven更胜一筹。
FunTester
2019/12/17
2.1K0
gradle编译打包过程分析之ProcessAndroidResources
首先,如何查看gradle源码,我们在项目里依赖com.android.tools.build:gradle即可,如下:
BennuCTech
2022/02/24
9830
【Android 字节码插桩】Gradle插件基础 & Transform API的使用
啪~我给大家开个会(手机扔桌子上) 什么叫做 客户无感的数据脱敏!? 师爷给翻译翻译什么叫做客户无感的数据脱敏? 什么特么的叫做客户无感数据脱敏? 举个栗子~ 客户端Sdk新升级了一个版本,增加针对客户的数据的脱敏,但是客户不需要重新调用新的api,且旧的api执行的性能还是不变的,那么大家可能就会问, 切入点在哪呢? 你不调用新的api或者改动旧的api,如何获取用户数据呢?
胖虎哥
2024/02/02
5690
【Android 字节码插桩】Gradle插件基础 & Transform API的使用
一文学会Android Gradle Transform基础使用
最近在做一个在 Android 工程编译期间动态插入一些随机代码的需求,我选择的是 Gradle Transform 技术,想起好久没有写过博客了,就记录一下这方面的一些基本使用。
Rouse
2021/02/23
1.9K0
一文学会Android Gradle Transform基础使用
Gradle For Android(7)--创建Task以及Plugin
到目前为止,我们已经看到了很多Gradle构建的属性,并且知道了怎么去执行Tasks。这一章,会更多的了解这些属性,并且创建我们自己的Task。一旦知道如何自定义Task之后,就可以完成更多的事情,并且自定义自己的插件,而在多工程中使用这些Task和Plugin。
None_Ling
2018/10/24
1.9K0
Gradle For Android(7)--创建Task以及Plugin
推荐阅读
相关推荐
Transform和Task之间有关?| Gradle
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验