说说 ByteX 里的插件是如何执行的
本篇有点灌水……
本来笔者想简单说下 “ByteX 里的插件的执行流程”,但是发现官方已经有很好的解释和说明了。所以就给出一些简单的说明好了。
首先可以参考的内容是 官方文档
-
以下为灌水内容,是随手写的笔记
plugin 是如何被执行的
- 类继承结构 :
CommonPlugin
->AbsMainProcessPlugin
>MainProcessHandler
-
TransformFlowManager
和MainTransformFlow
控制着插件处理过程中的逻辑流动
-
每个 plugin apply 被执行的时候,获得 project 的 byteX extension ,然后把自己 register 进去。
-
byteX 的 extension 执行 transform 的时候,执行每个注册 plugin 的 transfer。
-
flow 是做什么的?
- flow 花里胡哨的一堆类,但是实际工作类只有一个
MainTransformFlow
- flow 可以理解成 有参数的Runnable, ****一次 flow 的 run ,表示一次 class 文件的处理。
- handler 注册到 flow 里
- MainTransformFlow 负责
- 计时等逻辑
- 对每个 hanlder 进行 TRAVERSE / TRAVERSE_ANDROID / TRANSFORM 三个阶段的处理
- flow 花里胡哨的一堆类,但是实际工作类只有一个
-
ByteX 里字节码处理 chain 是什么样子的?
- 有三层调用
// 以 transform 为例 // 从 PerformTransformTask 开始处理计算。 - ProcessorChain - FilterFileProcessor , 去除 ”无变化“ 和 ”删除“ 的代码文件。 - 构造的 processor , ClassFileProcessor - MainProcessFileHandler 。 用来遍历所有的 plugin 的 transfor。 - 每个 plugin 在此依次被执行。 - 使用 ClassVisitor.accept 开始处理类, 链表后置节点是用 classvisitor delegate 的形式实现的。 - 最后是一个 ClassNode ,配合 ClassWriter 用来将修改后的 class 信息写入文件中。
- 类继承结构 :