一 gradle构建流程分为基本的三部:initlization,Configuration,Execution
1.初始化阶段
在这一阶段会解析加载init脚本和settings脚本,创建Settings对象,Project对象,决定哪些Project包含在构建中并建立构建的projects层级结构。
2.配置阶段
这一阶段的主要工作是根据build脚本配置上一步中生成的project对象,每一个project对应着一个build脚本。在这一阶段还会完成构建中Task的对象创建和配置,创建TaskGraph。
3.执行阶段
根据gradle命令执行对应的Task。
网上的一张图展示了基本的workflow
二 .
DefaultGradleLauncher类里,doBuildStages方法清楚的展示了上面的构建流程
其中:initialization包括Evaluate init scripts,Calculate projects
Configuration包括Configure build,Populate task graph
Execute对应Execute build
DefaultGradleLauncherFactory创建了DefaultGradleLauncher对象,DefaultGradleLauncher部分构造参数由buildScopeServices提供: BuildScopeServices buildScopeServices = BuildScopeServices.forSession((BuildSessionScopeServices) parentRegistry);
DefaultGradleLauncherFactory
public class DefaultGradleLauncherFactory implements GradleLauncherFactory {
private DefaultGradleLauncher doNewInstance(StartParameter startParameter, BuildCancellationToken cancellationToken, BuildRequestMetaData requestMetaData, BuildEventConsumer buildEventConsumer, BuildScopeServices serviceRegistry) {
serviceRegistry.add(BuildRequestMetaData.class, requestMetaData);
serviceRegistry.add(BuildClientMetaData.class, requestMetaData.getClient());
serviceRegistry.add(BuildEventConsumer.class, buildEventConsumer);
serviceRegistry.add(BuildCancellationToken.class, cancellationToken);
ListenerManager listenerManager = serviceRegistry.get(ListenerManager.class);
LoggingManagerInternal loggingManager = serviceRegistry.newInstance(LoggingManagerInternal.class);
loggingManager.setLevel(startParameter.getLogLevel());
//this hooks up the ListenerManager and LoggingConfigurer so you can call Gradle.addListener() with a StandardOutputListener.
loggingManager.addStandardOutputListener(listenerManager.getBroadcaster(StandardOutputListener.class));
loggingManager.addStandardErrorListener(listenerManager.getBroadcaster(StandardOutputListener.class));
LoggerProvider loggerProvider = (tracker.getCurrentBuild() == null) ? buildProgressLogger : LoggerProvider.NO_OP;
listenerManager.useLogger(new TaskExecutionLogger(serviceRegistry.get(ProgressLoggerFactory.class), loggerProvider));
if (tracker.getCurrentBuild() == null) {
listenerManager.useLogger(new BuildLogger(Logging.getLogger(BuildLogger.class), serviceRegistry.get(StyledTextOutputFactory.class), startParameter, requestMetaData));
}
listenerManager.addListener(tracker);
listenerManager.addListener(serviceRegistry.get(ProfileEventAdapter.class));
if (startParameter.isProfile()) {
listenerManager.addListener(new ReportGeneratingProfileListener());
}
ScriptUsageLocationReporter usageLocationReporter = new ScriptUsageLocationReporter();
listenerManager.addListener(usageLocationReporter);
DeprecationLogger.useLocationReporter(usageLocationReporter);
GradleInternal gradle = serviceRegistry.get(Instantiator.class).newInstance(DefaultGradle.class, tracker.getCurrentBuild(), startParameter, serviceRegistry.get(ServiceRegistryFactory.class));
return new DefaultGradleLauncher(
gradle,
serviceRegistry.get(InitScriptHandler.class),
serviceRegistry.get(SettingsLoader.class),
serviceRegistry.get(BuildConfigurer.class),
serviceRegistry.get(ExceptionAnalyser.class),
loggingManager,
gradle.getBuildListenerBroadcaster(),
listenerManager.getBroadcaster(ModelConfigurationListener.class),
listenerManager.getBroadcaster(BuildCompletionListener.class),
serviceRegistry.get(BuildOperationExecutor.class),
gradle.getServices().get(BuildConfigurationActionExecuter.class),
gradle.getServices().get(BuildExecuter.class),
serviceRegistry
);
}
}
DefaultGradleLauncher
doBuildStages方法实现了gradle构建的基本流程:
private BuildResult doBuild(final Stage upTo) {
loggingManager.start();
return buildOperationExecutor.run("Run build", new Factory<BuildResult>() {
@Override
public BuildResult create() {
Throwable failure = null;
try {
buildListener.buildStarted(gradle);
doBuildStages(upTo);
} catch (Throwable t) {
failure = exceptionAnalyser.transform(t);
}
BuildResult buildResult = new BuildResult(gradle, failure);
buildListener.buildFinished(buildResult);
if (failure != null) {
throw new ReportedException(failure);
}
return buildResult;
}
});
}
private void doBuildStages(Stage upTo) {
// Evaluate init scripts
initScriptHandler.executeScripts(gradle);
// Calculate projects
settingsLoader.findAndLoadSettings(gradle);
// Configure build
buildOperationExecutor.run("Configure build", new Runnable() {
@Override
public void run() {
buildConfigurer.configure(gradle);
if (!gradle.getStartParameter().isConfigureOnDemand()) {
buildListener.projectsEvaluated(gradle);
}
modelConfigurationListener.onConfigure(gradle);
}
});
if (upTo == Stage.Configure) {
return;
}
// Populate task graph
buildOperationExecutor.run("Calculate task graph", new Runnable() {
@Override
public void run() {
buildConfigurationActionExecuter.select(gradle);
if (gradle.getStartParameter().isConfigureOnDemand()) {
buildListener.projectsEvaluated(gradle);
}
}
});
// Execute build
buildOperationExecutor.run("Run tasks", new Runnable() {
@Override
public void run() {
buildExecuter.execute(gradle);
}
});
assert upTo == Stage.Build;
}