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();
}
}
复制代码
在 ByteX
中 transform()
的核心实现被剥离到 transformInternal()
方法中进行实现,大体上可以分为以上的 15
个步骤,详细的步骤可以参见代码中的注释进行了解。这里我们重点介绍步骤 6-10
,给 Plugin
注册 Transform
回调,同时绑定到 TransformFlowerManager
。
在这个流程中涉及到相关的关键类:
-
CommonTransform
:自定义插件中Transform
的实现父类 -
TransformFlowerManager
:用于管理Transform
过程管理,包含TransformFlow
关系和Transform
过程 -
TransformEngine
:Transform
过程的处理工具类,封装了Transform
中的任务,比如traverseAndroidJar
-
MainTransformFlow
:Transform
处理产物承载体 -
AbsMainProcessPlugin
:自定义插件的抽象类
步骤 6:创建 ITransformPipeline 对象
在该步骤中创建一个 TransformFlowerManager
实例对象 manager
,TransformFlowerManager
类中包含 MainTransformFlow
、TransformEngine
和 TransformFlow
三个实例构成。
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
在该步骤中回到每个 Plugin
的 startExecute
方法,查看 AbsPlugin
中的实现触发的是 onByteXPluginStart
。
// 源码对应 AbsPlugin 类
public void startExecute(TransformContext transformContext) {
GlobalByteXBuildListener.INSTANCE.onByteXPluginStart(this);
}
复制代码
步骤 8: Plugin.registerTransformFlow
我们将步骤 8
的 Lambda
写法调整一下,方便我们理解。
plugins.forEach(plugin -> {
manager.bind(new FlowBinder() {
@Override
public TransformFlow bind(TransformFlowerManager manager) {
return plugin.registerTransformFlow(manager.getCommonFlow(), transformContext);
}
});
}
);
复制代码
在这个步骤中,遍历每个 Plugin
,通过调用 TransformFlowerManager
的 bind
方法将每个 Plugin
对应的