zoukankan      html  css  js  c++  java
  • 【灌水】说说 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 信息写入文件中。
        
        
  • 相关阅读:
    Git failed with a fatal error. Authentication failed
    HttpClient 获取json,即使返回状态不成功也返回json
    win10恢复Windows Media Player
    .NET Core部署到linux(CentOS)最全解决方案
    EasyNetQ 相关问题和解决方法
    RabbitMQ And EasyNetQ
    打爆你的 CPU
    通过代码实现 OutOfMemory
    如何写一段死锁代码
    docker 容器(container)使用ssh服务登录一段时间无操作后自动断开问题解决
  • 原文地址:https://www.cnblogs.com/wkmcyz/p/15713318.html
Copyright © 2011-2022 走看看