Gradle系列之Groovy基础
Gradle系列之Gradle基础
Gradle系列之自定义插件
Android构建流程(Android Plugin)源码解析系列一:主流程
gradle的工作流程
gradle工作流程分为三步
- Initialization : 这个阶段,主要是会分析哪些module将被构建。这个时候又一个很明显的操作就是这个阶段会解析settings.gradle,并创建project对象。
- Configuration :这个阶段,主要是执行当前项目所有需要构建的module以及root project的build.gradle脚本;这个过程会形成每个项目的task依赖图。
- Execution :这个阶段,执行我们指定的task任务,以及其依赖的任务
下面来看看gradle build过程中,我们可以监听到的回调函数
gradle.addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) { // 构建开始执行之前的回调
}
@Override
void settingsEvaluated(Settings settings) { // setting 评估完成的回调,也就是settings.gradle加载执行完成的回调
}
@Override
void projectsLoaded(Gradle gradle) { // project加载完成的回调
}
@Override
void projectsEvaluated(Gradle gradle) { // project 评估完成的回调, 也就是所有的build.gradle脚本都加载执行完成的回调
}
@Override
void buildFinished(BuildResult result) { // 构建完成的回调
}
具体构建的代码如下:
private BuildResult doBuild(final Stage upTo) {
return buildOperationExecutor.run("Run build", new Factory<BuildResult>() {
@Override
public BuildResult create() {
Throwable failure = null;
try {
//回调buildStarted,但此时init.gradle没有被执行,时机太早
buildListener.buildStarted(gradle);
doBuildStages(upTo);
} catch (Throwable t) {
failure = exceptionAnalyser.transform(t);
}
BuildResult buildResult = new BuildResult(upTo.name(), gradle, failure);
buildListener.buildFinished(buildResult); // task执行结束的回调函数
if (failure != null) {
throw new ReportedException(failure);
}
return buildResult;
}
});
}
private void doBuildStages(Stage upTo) {
// Evaluate init scripts 执行init脚本
initScriptHandler.executeScripts(gradle);
// Calculate projects, 执行setting.gradle
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;
}
通过上面执行的代码可以看出,在执行构建的过程,会先执行buildStarted()回调函数,然后执行真正的构建步骤,最后执行buildFinished()回调函数。构建步骤:先加载并执行init脚本,然后加载settings.gradle脚本,这个时候根据其内容,确定要加载那些build.gradle脚本,并且为每一个创建一个project实例;然后加载每个build.gradle脚本,并生成task的依赖图&#x