1. 寫在前面
在 Gradle源碼分析(五)一文中,我們分析了Gradle構(gòu)建流程的
RunTasks階段,這里將分析Finished階段(gradle 源碼版本為 5.6.4)。
2. Finished
2.1 整體實現(xiàn)
這里我整理了 Finished 階段的一些主要操作,并繪制了調(diào)用鏈的時序圖。如果對源碼不感興趣的同學(xué)只需要看這一部分的內(nèi)容即可。
2.1.1 時序圖

Finished時序圖.png
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));
}
}
這里首先會調(diào)用 BuildListener 的 buildFinished(),然后將 Gradle 狀態(tài)設(shè)置為 Finished,并處理異常信息。