字节码插件平台 ByteX 源码解析,吃一堑长一智

manager.skipTransform();

}

// 12. 触发 afterTransform 回调

afterTransform(transformInvocation);

} catch (Throwable throwable) {

LevelLog.sDefaultLogger.e(throwable.getClass().getName(), throwable);

throw throwable;

} finally {

// 13. 遍历执行 Plugin 的 afterExecute

for (IPlugin plugin : plugins) {

try {

plugin.afterExecute();

} catch (Throwable throwable) {

LevelLog.sDefaultLogger.e(“do afterExecute”, throwable);

}

}

// 14. 释放 TransformContext

transformContext.release();

this.configurations = null;

timer.record(“Total cost time = [%s ms]”);

// 15. 日志输出

if (BooleanProperty.ENABLE_HTML_LOG.value()) {

HtmlReporter.getInstance().createHtmlReporter(getName());

HtmlReporter.getInstance().reset();

}

LevelLog.sDefaultLogger = new LevelLog();

}

}

复制代码

ByteXtransform() 的核心实现被剥离到 transformInternal() 方法中进行实现,大体上可以分为以上的 15 个步骤,详细的步骤可以参见代码中的注释进行了解。这里我们重点介绍步骤 6-10,给 Plugin 注册 Transform 回调,同时绑定到 TransformFlowerManager

transform

在这个流程中涉及到相关的关键类:

  • CommonTransform:自定义插件中 Transform 的实现父类

  • TransformFlowerManager:用于管理 Transform 过程管理,包含 TransformFlow 关系和 Transform 过程

  • TransformEngineTransform 过程的处理工具类,封装了 Transform 中的任务,比如 traverseAndroidJar

  • MainTransformFlowTransform 处理产物承载体

  • AbsMainProcessPlugin:自定义插件的抽象类

步骤 6:创建 ITransformPipeline 对象

在该步骤中创建一个 TransformFlowerManager 实例对象 managerTransformFlowerManager 类中包含 MainTransformFlowTransformEngineTransformFlow 三个实例构成。

private final MainTransformFlow commonFlow;

private final TransformEngine engine;

private TransformFlow first;

public TransformFlowerManager(TransformContext context) {

this.engine = new TransformEngine(context);

this.commonFlow = new MainTransformFlow(engine);

}

复制代码

步骤 7:回调 Plugin.startExecute

在该步骤中回到每个 PluginstartExecute 方法,查看 AbsPlugin 中的实现触发的是 onByteXPluginStart

// 源码对应 AbsPlugin 类

public void startExecute(TransformContext transformContext) {

GlobalByteXBuildListener.INSTANCE.onByteXPluginStart(this);

}

复制代码

步骤 8: Plugin.registerTransformFlow

我们将步骤 8Lambda 写法调整一下,方便我们理解。

plugins.forEach(plugin -> {

manager.bind(new FlowBinder() {

@Override

public TransformFlow bind(TransformFlowerManager manager) {

return plugin.registerTransformFlow(manager.getCommonFlow(), transformContext);

}

});

}

);

复制代码

在这个步骤中,遍历每个 Plugin,通过调用 TransformFlowerManagerbind 方法将每个 Plugin 对应的

  • 13
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值