1. 寫在前面
在 Gradle源碼分析(五)一文中盅粪,我們分析了Gradle構(gòu)建流程的
RunTasks
階段,這里將分析Finished
階段(gradle 源碼版本為 5.6.4)悄蕾。
2. Finished
2.1 整體實(shí)現(xiàn)
這里我整理了 Finished
階段的一些主要操作票顾,并繪制了調(diào)用鏈的時(shí)序圖。如果對(duì)源碼不感興趣的同學(xué)只需要看這一部分的內(nèi)容即可。
2.1.1 時(shí)序圖
2.1.2 主要操作
Finished
階段 Gradle 主要做了下面這些事情奠骄。
- 調(diào)用
BuildListener
的buildFinished()
豆同。
2.2 源碼分析
2.2.1 調(diào)用 BuildListener 的 buildFinished()
Finished
過程發(fā)生在 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));
}
}
這里首先會(huì)調(diào)用 BuildListener
的 buildFinished()
影锈,然后將 Gradle
狀態(tài)設(shè)置為 Finished
,并處理異常信息民晒。