1. 写在前面
在 Gradle源码分析(五)一文中,我们分析了Gradle构建流程的
RunTasks
阶段,这里将分析Finished
阶段(gradle 源码版本为 5.6.4)。
2. Finished
2.1 整体实现
这里我整理了 Finished
阶段的一些主要操作,并绘制了调用链的时序图。如果对源码不感兴趣的同学只需要看这一部分的内容即可。
2.1.1 时序图
2.1.2 主要操作
Finished
阶段 Gradle 主要做了下面这些事情。
- 调用
BuildListener
的buildFinished()
。
2.2 源码分析
2.2.1 调用 BuildListener 的 buildFinished()
Finished
过程发生在 DefaultGradleLauncher
的 finishBuild()
,来看看其源码。
public void finishBuild() {
if (stage != null) {
finishBuild(stage.getDisplayName(), null);
}
}
private void finishBuild(String action, @Nullable Throwable stageFailure) {
if (stage == Stage.Finished) {
return;
}
RuntimeException reportableFailure = stageFailure == null ? null : exceptionAnalyser.transform(stageFailure);
BuildResult buildResult = new BuildResult(action, gradle, reportableFailure);
List<Throwable> failures = new ArrayList<Throwable>();
includedBuildControllers.finishBuild(failures);
try {
buildListener.buildFinished(buildResult);
} catch (Throwable t) {
failures.add(t);
}
stage = Stage.Finished;
// 处理异常
if (failures.isEmpty() && reportableFailure != null) {
throw reportableFailure;
}
if (!failures.isEmpty()) {
if (stageFailure instanceof MultipleBuildFailures) {
failures.addAll(0, ((MultipleBuildFailures) stageFailure).getCauses());
} else if (stageFailure != null) {
failures.add(0, stageFailure);
}
throw exceptionAnalyser.transform(new MultipleBuildFailures(failures));
}
}
这里首先会调用 BuildListener
的 buildFinished()
,然后将 Gradle
状态设置为 Finished
,并处理异常信息。