Transform介绍(1)

news2025/9/17 15:00:27

文章目录

  • 1. transform 方法
  • 2. transform 增量模式
  • 3. 注册 Transform

img

使用Transform的常见场景有埋点统计、耗时监控、方法替换

通过上图以我们了解下transform的作用,transform在 class 到 dex 之间工作,处理包括 javac 编译后的字节码文件,每个 transform 都对应一个 Task,transform 的输入和输出对应 transform task 的输入输出。每个 transform task 的输出都分别存储在app\build\intermediates\transform\[Transform Name]\[Variant]

1. transform 方法

Transfom 的几个核心API可以查看 buildSrc方式 - transform 下的介绍,这里我们着重挑 transform 方法做下介绍

 @Override
    void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException {
        super.transform(transformInvocation)
        println '转换开始........................'

        def start = System.currentTimeMillis()
        def inputs = transformInvocation.inputs
        def outputProvider = transformInvocation.outputProvider

        if (outputProvider != null)
            outputProvider.deleteAll()

        // transform 的 inputs 有两种类型:一种是目录,一种是jar包
        inputs.each { input ->
            // 本地 project 编译成的多个 class 文件存放的目录
            input.directoryInputs.each { dir ->
                handleDirectory(dir,outputProvider)
            }
            // 各依赖锁编译成的 jar 文件
            input.jarInputs.each { jar ->
                handleJar(jar, outputProvider)
            }
        }
        def cost = (System.currentTimeMillis() - start) / 1000
        println "转换结束............................:$cost"
    }
  • getInputs:获取 TransformInput 对象,它是消费型输入内容,对应 getScopes() 定义的范围,transformInput 由两部分组成
    • DirectoryInput 集合:以源码方式参与构建的输入文件,包括完整的源码目录结构及其中的源码文件
    • JarInput集合:以jaraar依赖方式参与构建的输入文件,包含本地依赖和远程依赖
  • getOutPutProvider:获取 TransformOutputProvider 对象,它是对输出文件的描述,它有两个功能
    • deleteAll:当 transform 以非增量构建模式时,需要删除上一次构建产生的所有中间文件,可以使用该方法
    • getContentLocation:获得指定范围+类型的输出目标路径

2. transform 增量模式

任何构建系统都会尽量避免重复执行相同工作,transform 也提供了这样的备选项

  1. 增量标记位

    • Transform#isIncremental():返回 true 才会触发增量模式
    • TransformInvocation#isIncremental():表示 TransformTask 是否增量执行
  2. Task 增量模式与 Transform 增量模式区别

    前者会跳过整个 Task 的动作列表,后者还是会依次执行 TransformTask,但输入内容胡增加变更内容信息

  3. 增量模式的输入

    此模式下的输入都是带状态的,需要根据这些状态做不同处理,无需每次都执行所有流程;例如新增的输入需要处理,未修改的输入就无需处理,Transform 定义了4个输入文件状态

    // com.android.build.api.transform\Status.java
    @Deprecated
    public enum Status {
        // 未修改,无需处理,也无需复制操作
        NOTCHANGED,
        // 新增,正常处理并复制给下一个任务
        ADDED,
        // 已修改,正常处理并复制给下一个任务
        CHANGED,
        // 已删除,需同步移除 OutputProvider 指定的目标文件
        REMOVED;
    }
    

3. 注册 Transform

Gradle:com.android.tools.build:gradle-7.0.2.jar 下的 BaseExtension 中维护了 Transform 列表,自定义 Transform 需要注册才能生效,并且还支持设置 TransformTask 的依赖

// com.android.build.gradle\BaseExtension.kt
bstract class BaseExtension protected constructor(
    protected val dslServices: DslServices,
    protected val globalScope: GlobalScope,
    ...
    ):AndroidConfig, Lockable {
    private val _transforms: MutableList<Transform> = mutableListOf()
    /** Secondary dependencies for the custom transform. */
    private val _transformDependencies: MutableList<List<Any>> = mutableListOf()
    
    ...
    fun registerTransform(transform: Transform, vararg dependencies: Any) {
        _transforms.add(transform)
        _transformDependencies.add(listOf(dependencies))
    }
}

注册 Transform:

// 获取 Android 扩展
val androidExt = project.extensions.getByType(BaseExtension::class.java)
// 注册 Transform,支持额外增加依赖
androidExt.registerTransform(MyTransform())

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

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

相关文章

【Linux内核系列】进程调度

目录 一、为什么要调度 二、调度均衡 三、进程调度框架 3.1 调度队列 3.2 进程唤醒 3.3 调度时机 主动调度&#xff1a; 被动调度&#xff1a; 四、调度算法 4.1 先来先服务调度算法 4.2 最短作业优先调度算法 4.3 高响应比优先调度算法 4.4 时间片轮转调度算法 …

洛谷千题详解 | P1007 独木桥【C++、Pascal语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目背景 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Pascal源码&#xff1a; ------------------------------------------------------------------------------------…

NFT 推荐|辛迪加黑市系列第一弹

由 Planet Rift 呈现&#xff01; 塞巴星球的辛迪加已经洗劫了政府&#xff0c;现在是时候揭开补给品的神秘面纱了&#xff01; 辛迪加黑市系列的第一弹包括 30 个由 Planet Rift 宇宙设计的资产。其中首次发售的包含 4 套未来风格的盔甲、3 台彩色自动售货机和其他装备。 别忘…

项目管理之项目干系人

目录 前言 一、项目干系人的重要性 二、项目干系人管理过程 三、识别干系人 1.识别干系人的概念定义 2.识别干系人的输入 3.干系人分类模型 4.识别干系人的工具与技术 5.识别干系人的输出 四、规划干系人管理 1.规划干系人的输入 2.规划干系人的工具与技术 3.规划…

电脑蓝屏是哪里出了问题?不一定要非要重装系统

电脑蓝屏是非常常见的电脑故障现象&#xff0c;导致电脑蓝屏的原因很多&#xff0c;很多人第一时间反应可能是给电脑重装系统&#xff0c;但是有时并不能解决问题。那么电脑蓝屏是哪里出了问题呢&#xff1f;其实导致蓝屏不一定是系统故障&#xff0c;还有很多情况也会出现蓝屏…

Python3,爬虫有多简单,一个库,一行代码,就OK, 你确定不来试试?

爬虫进阶库&#xff1a;Scrapeasy1、 引言2、Scrapeasy2.1 简介2.1.1 Scrap2.1.2 Scrapeasy2.2 安装2.3 代码示例3、总结1、 引言 小屌丝&#xff1a;鱼哥&#xff0c; 我最近在练习写爬虫&#xff0c; 你有没有什么便捷的方式… 小鱼&#xff1a;比如呢&#xff1f; 小屌丝&a…

公众号网课查题接口

公众号网课查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

【C】自定义类型(二)位段,枚举,联合

&#x1f648;个人主页&#xff1a; 对de起日子 &#x1f449;系列专栏&#xff1a;【C语言–大佬之路】 &#x1f388;今日心语&#xff1a;谨慎的选择自己的生活&#xff0c;不要轻易让自己迷失在各种诱惑里。 前一章我们介绍了结构体&#xff0c;这一章我们来介绍一下内容&a…

大猩猩优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

springboot:整合其它项目

目录 一、集成Druid application.yml 二、集成redis之非注解式开发 pom.xml application.yml RedisConfig ClazzBizImpl.java 三、集成redis之注解缓存开发 RedisConfig RedisConfig 一、集成Druid 在昨天的基础上 参考网址 https://github.com/alibaba/druid/tre…

C---指针

目录指针偏移问题&#xff1a;为什么用指针&#xff1f;1.强制给指针选地址&#xff1a;2.交换两个变量的值指针与数组1.指针数组&#xff1a;数组中的每一项都是个指针2. 指针数组的用法数组指针&#xff1a;一个指向数组的指针函数指针&#xff1a;malloc内存泄露&#xff08…

洛谷千题详解 | P1005 [NOIP2007 提高组] 矩阵取数游戏【C++、 Java、Python语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; Java源码&#xff1a; Python源码&#xff1a; ----------------------------------------------------------------------…

论文阅读之RETHINKING POSITIONAL ENCODING IN LANGUAGE PRE-TRAINING

文章目录论文阅读总结参考论文阅读 文章大概提出了两个问题&#xff1a; 1.对于原来的transformer或者bert的embedding中&#xff0c;直接将word embedding&#xff08;词向量&#xff09;和positional embedding &#xff08;位置编码&#xff09;相加是不合理的&#xff0c;…

Netty入门——组件(Channel)一

目录一、channel的主要作用二、EventLoop处理io任务代码示例2.1、服务端代码示例2.2、客户端代码示例2.3、服务端和客户端查看控制台输出结果三、ChannelFuture连接问题代码示例3.1、服务端代码示例3.2、客户端代码示例3.3、服务端和客户端查看控制台输出结果3.4、ChannelFutur…

MyBatis的二级缓存

MyBatis的二级缓存 二级缓存是SqlSessionFactory级别&#xff0c;通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存&#xff1b;此后若再次执行相同的查询语句&#xff0c;结果就会从缓存中获取。 二级缓存开启的条件&#xff1a; 1.在核心配置文件中&#x…

软件测试:写一个好的测试用例

测试场景&#xff1a; 为登录功能设计测试用例 测试员为什么要会编测试用例 测试员的目标是要保证系统在各种场景下的功能是符合设计要求的。而测试用例就是测试员想到的测试场景。&#xff08;这也是高级别的测试员即使不会代码也能找到较好工作的原因&#xff09; 编写测试…

数据库2,DQL数据查询语言,表关联关系

目录 DQL数据查询语言 简单查询语句 计算列 别名 distinct消除重复行 条件查询 条件运算符 null值判断 枚举查询 模糊查询 分支查询 函数 字符串函数 聚合函数 排序查询 分组查询Group by 分页查询Limit 表关联关系 一对一关联 一对多与多对一 多对多关联 …

[CKA备考实验][ingress-nginx] 4.2 集群外访问POD

1.创建Deployments 部署方法请参照&#xff1a; https://blog.csdn.net/qq_33868661/article/details/127505429?spm1001.2014.3001.5501 apiVersion: apps/v1 kind: Deployment metadata:labels:name: deploy1annotations:name: deploy1name: deploy1namespace: default sp…

要么干要么滚!推特开始裁员了;深度学习产品应用·随书代码;可分离各种乐器音源的工具包;Transformer教程;前沿论文 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f4c6;电子月刊 | &#x1f369;韩信子 &#x1f4e2; 解散Twitter董事会&#xff0c;代码审查&#xff0c;裁员25%&#xff0c;收每月20美元认证费马斯克那些骚操作 埃隆马斯克 (Elon Musk) 抱着洗手池入主 Twitter 后&#xff0c;狂风骤雨已…

STM32入门——uKeil5 MDK 的使用(基于固件库)

文章目录1 Keil uVision5 MDK 是什么2 建立一个标准库函数工程2.1 前期准备2.2 建立工程2.3 建立组文件夹2.4 添加文件2.4 配置“魔术棒”选项卡2.5 建立 main 函数1 Keil uVision5 MDK 是什么 Keil 软件是一种统称&#xff0c;它包含编辑器、编译器、链接器、调试器等众多工具…