Gradle-2 初始化篇(LoadSetings)
调试
法一:
https://docs.gradle.org/current/userguide/troubleshooting.html
./gradlew taskname -Dorg.gradle.debug=true --no-daemon
法二:
找到GradleRunConfiguration类
这样可以方便gradle源码调试
参考:https://medium.com/dan-on-coding/debugging-gradle-source-code-in-intellij-e1224bec9b6e
入口
DefaultGradleLauncher
public GradleInternal executeTasks() {
doBuildStages(Stage.RunTasks);
return gradle;
}
private void doBuildStages(Stage upTo) {
Preconditions.checkArgument(
upTo != Stage.Finished,
"Stage.Finished is not supported by doBuildStages."
);
try {
if (stage == null && gradle.isRootBuild()) {
buildOptionBuildOperationProgressEventsEmitter.emit(gradle.getStartParameter());
}
if (upTo == Stage.RunTasks && configurationCache.canLoad()) {
doConfigurationCacheBuild();
} else {
doClassicBuildStages(upTo);
}
} catch (Throwable t) {
finishBuild(upTo.getDisplayName(), t);
}
}
private void doClassicBuildStages(Stage upTo) {
if (stage == null) {
configurationCache.prepareForConfiguration();
}
prepareSettings();
if (upTo == Stage.LoadSettings) {
return;
}
prepareProjects();
if (upTo == Stage.Configure) {
return;
}
prepareTaskExecution();
if (upTo == Stage.TaskGraph) {
return;
}
configurationCache.save();
runWork();
}
代码可以看到doClassicBuildStages中调用了prepareSettings方法,该方法就是我们理解的gradle配置阶段,本篇主要来梳理下内部实现流程
private void prepareSettings() {
if (stage == null) {
buildListener.buildStarted(gradle);
settingsPreparer.prepareSettings(gradle);
stage = Stage.LoadSettings;
}
}
配置篇小结:
-
生命接口方法buildStarted调用
首先是触发了buildListener的buildStarted方法(该监听器可以通过grade.addListener来实现)
-
执行初始化脚本
InitScriptHandler.executeScripts
-
寻找并解析setting.gradle文件
-
加载gradle.properties文件
-
解析buildSrc工程文件