【灌水】说说 ByteX 里的插件是如何执行的

说说 ByteX 里的插件是如何执行的

本篇有点灌水……

本来笔者想简单说下 “ByteX 里的插件的执行流程”,但是发现官方已经有很好的解释和说明了。所以就给出一些简单的说明好了。

首先可以参考的内容是 官方文档

  • 以下为灌水内容,是随手写的笔记

    plugin 是如何被执行的

    1. 类继承结构 :CommonPlugin -> AbsMainProcessPlugin > MainProcessHandler
    2. TransformFlowManagerMainTransformFlow 控制着插件处理过程中的逻辑流动
    • 每个 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 三个阶段的处理
    • ByteX 里字节码处理 chain 是什么样子的?

      • 有三层调用
      // 以 transform 为例
      // 从 PerformTransformTask 开始处理计算。
      - ProcessorChain
      	- FilterFileProcessor , 去除 ”无变化“ 和 ”删除“ 的代码文件。
      	- 构造的 processor  , ClassFileProcessor
      		- MainProcessFileHandler 。 用来遍历所有的 plugin 的 transfor。
      			- 每个 plugin 在此依次被执行。
      			- 使用 ClassVisitor.accept 开始处理类, 链表后置节点是用 classvisitor delegate 的形式实现的。
      			- 最后是一个 ClassNode ,配合 ClassWriter 用来将修改后的 class 信息写入文件中。
      
      
posted @ 2021-12-20 22:45  wkmcyz  阅读(82)  评论(0编辑  收藏  举报