每当大家有在编译期间有修改字节码的需求,第一反应应该就是使用 Transform 吧,我们知道每个 Transform 都有它的输入、输出,问几个问题:
- 在编译过程中,有哪些“系统Transform”执行?
- 自定义 Transform和其他系统Transform执行的顺序是怎么样的?
- Transform和 gradle task的关系是怎么样的?
更多问答 >>
-
每日一问 | 关于 RecyclerView$Adapter setHasStableIds(boolean)的一切
2020-10-26 23:44 -
每日一问 | 属性动画与硬件加速的相遇,不是你想的那么简单?
2020-10-26 23:45 -
每日一问 | 当Unsafe遇上final,超神奇的事情发生了?
2020-11-02 00:16 -
每日一问 | Call requires API level 23 (current min is 14) 扫描出来的原理是?
2020-12-27 22:39 -
每日一问 | View invalidate() 相关的一些细节探究~
2020-12-27 22:38 -
每日一问 | 启动了Activity 的 app 至少有几个线程?
2020-10-12 00:47 -
2020-10-03 11:43
-
2020-09-09 23:54
-
2020-08-26 21:11
-
2020-08-23 23:54
不知道
回去等消息吧
太真实了
哈哈
什么是Task
其实核心还是要先从什么是Task讲起了。
简单的说我们的项目编译以assembleDebug为例子,会顺序执行非常多的gradle task任务,举个例子比如说aapt,javac,kotlinc等等,他们都是作为一个task存在的。
AGP中的Transform
当我们在编写一个
Transform
的plugin
的时候,其实是对安卓的AppExtension
进行了一个注册Transform
的操作而已,那么Transform的本质到底是什么呢?高能预警,下面的源代码比较长,可以考虑直接跳过看结论,但是看得懂的同学最好可以学习下。
自定义Transform和其他系统Transform执行的顺序
而且上述方法我们可以看出,任务还是会根据DAG(有向无环图)生成Task,其中会包含一些系统的Transform,其顺序有可能会被插入到自定义的Transform之前,而有一些则会被放置在所有的Tranform执行之后。比如
LibraryJniLibsTransform
。Transform和Task的关系
从这部分源代码其实我们就可以看出,我们注册到
AppExtension
里面的Transform
,最后会createTasksForVariantScope
方法调用到。然后我们看
transformManager.addTransform
,直接观察最后一行代码,发现我们会往taskFactory中直接注册一个TransformTask
,那么回答第一个问题,一个Transform就是gradle plugin中的一个原子的Task,所以Transform==Task
。Transform是如何被执行的
当我们知道Transform的本质是Task之后就知道了,他会和一个普通的Task一样被执行,而且会按照特定的依赖顺序执行。
再不来我要去找你了
偷懒了 偷懒了
看看
只写过几次,这块了解还真的少,坐等答案