在官方和源码层面,可以细分为更多步骤。下面我以官方推荐的五大主要阶段为主,每个环节再细化到具体方法、内部逻辑、源码行级剖析,并结合具体场景实例,帮助你真正掌握Gradle的工作机制。
步骤 | 关键类/方法 | 说明 |
---|---|---|
1 | org.gradle.wrapper.GradleWrapperMain.main() |
Wrapper入口 |
2 | org.gradle.launcher.GradleMain.main() |
Gradle主入口 |
3 | CommandLineActionFactory.convert() |
解析命令行参数 |
4 | DaemonClient.execute() |
是否用守护进程 |
// org.gradle.wrapper.GradleWrapperMain
public static void main(String[] args) {
// 判断wrapper配置,启动GradleMain
GradleMain.main(args);
}
// org.gradle.launcher.GradleMain
public static void main(String[] args) {
CommandLineActionFactory.convert(args);
// 判断是否用守护进程
DaemonClient.execute();
}
./gradlew build
,其实先运行的是 GradleWrapperMain
,再到 GradleMain
。“命令启动,参数先行”
settings.gradle
,确定是单项目还是多项目。步骤 | 关键类/方法 | 说明 |
---|---|---|
1 | SettingsLoader.findAndLoadSettings() |
查找和加载settings.gradle |
2 | DefaultGradleSettingsProcessor.process() |
处理settings逻辑 |
// org.gradle.initialization.SettingsLoader
public SettingsInternal findAndLoadSettings() {
// 递归查找settings.gradle
// 解析里面的include等多项目指令
}
settings.gradle
里有include 'app', 'lib'
,本阶段会扫描并识别所有子项目。“定位目录,扫描settings”
Project
对象,形成项目树,但不执行build.gradle
内容。步骤 | 关键类/方法 | 说明 |
---|---|---|
1 | ProjectFactory.createProject() |
创建Project实例 |
2 | ProjectRegistry.addProject() |
注册所有Project |
// org.gradle.api.internal.project.ProjectFactory
public Project createProject(...) {
// new DefaultProject(...)
// 仅创建对象,不执行build.gradle
}
root
、app
、lib
三个子工程,这一步只创建这三个Project
对象。“树立项目,尚未配置”
build.gradle
,配置插件、任务、依赖等。步骤 | 关键类/方法 | 说明 |
---|---|---|
1 | Project.evaluate() |
执行build.gradle |
2 | ScriptHandler.applyScripts() |
应用插件和脚本 |
3 | Project.afterEvaluate() |
配置后钩子 |
// org.gradle.api.internal.project.DefaultProject
public void evaluate() {
scriptHandler.applyScripts(); // 执行build.gradle
// 处理afterEvaluate等钩子
}
build.gradle
里写了apply plugin: 'java'
、dependencies {}
等,这一步会被执行。“脚本配置,任务齐备”
步骤 | 关键类/方法 | 说明 |
---|---|---|
1 | TaskGraphExecuter.populate() |
构建任务依赖图 |
2 | TaskGraphExecutor.execute() |
顺序执行任务 |
3 | Task.execute() |
执行任务本身 |
// org.gradle.execution.taskgraph.DefaultTaskGraphExecuter
public void populate() {
// 递归分析依赖,形成有向无环图
}
public void execute(TaskExecutionGraphInternal graph) {
for (Task task : graph.getAllTasks()) {
task.execute();
}
}
gradle build
,会自动先执行compileJava
、processResources
等依赖任务。task hello { doLast { println 'Hello, Gradle!' } }
,执行gradle hello
时,这段代码会在task.execute()
时被执行。“依赖成图,顺序执行”
┌──────────────┐
│ 启动阶段 │
│ 解析命令行 │
└─────┬────────┘
▼
┌──────────────┐
│ 初始化阶段 │
│ 加载settings │
└─────┬────────┘
▼
┌──────────────┐
│ 项目加载阶段 │
│ 创建Project │
└─────┬────────┘
▼
┌──────────────┐
│ 配置阶段 │
│ 执行build │
└─────┬────────┘
▼
┌──────────────┐
│ 执行阶段 │
│ 执行任务 │
└──────────────┘
假设你的build.gradle
有:
task hello {
doLast {
println 'Hello, Gradle!'
}
}
Project.evaluate()
解析build.gradle
,通过doLast
添加了一个Action
到hello
任务。TaskGraphExecutor.execute()
遍历到hello
任务。hello.execute()
时,遍历actions
,执行doLast
块。Hello, Gradle!
对应源码(简化):
// org.gradle.api.internal.AbstractTask
public void execute() {
for (Action<? super Task> action : actions) {
action.execute(this); // 调用doLast代码块
}
}
“命令启动,定位设定,树立项目,脚本配置,依赖成图,顺序执行”
启动命令行,初始化定位settings,加载项目树,配置build脚本,构建依赖图,执行各任务。
阶段 | 关键方法/类 | 内部逻辑 | 场景/实例 | 口诀 |
---|---|---|---|---|
启动 | WrapperMain, GradleMain | 解析命令行/守护进程 | ./gradlew build |
命令启动 |
初始化 | SettingsLoader | 加载settings | 识别多项目/单项目 | 定位设定 |
项目加载 | ProjectFactory, ProjectRegistry | 创建Project树 | root /app /lib 项目对象创建 |
树立项目 |
配置 | Project.evaluate, ScriptHandler | 执行build.gradle | 插件、任务、依赖定义 | 脚本配置 |
执行 | TaskGraphExecuter, TaskExecutor | 构建依赖图并执行任务 | 任务执行、doFirst/doLast | 依赖成图,顺序执行 |
进一步剖析Gradle五大环节的更深源码细节,包括关键对象的创建、重要接口的调用、内部状态的变化、典型设计模式、核心数据结构、生命周期钩子等。每一环节都包含源码行级说明,让你把握Gradle底层实现。
org.gradle.wrapper.GradleWrapperMain
org.gradle.launcher.GradleMain
org.gradle.launcher.daemon.client.DaemonClient
org.gradle.launcher.cli.CommandLineActionFactory
// wrapper主入口
public static void main(String[] args) {
File gradleHome = // 解析wrapper配置
// 构造并调用GradleMain
GradleMain.main(args);
}
// org.gradle.launcher.cli.CommandLineActionFactory
public Action<ExecutionContext> convert(String[] args) {
// 解析参数到StartParameter对象
StartParameter parameter = new CommandLineParser().parse(args);
// 根据参数决定是help、tasks、build等
}
// org.gradle.launcher.daemon.client.DaemonClient
public void execute() {
// 检查是否已有Daemon进程
// 若无则fork新进程,启动DaemonMain
// 通过Socket通信传递参数
}
org.gradle.launcher.daemon.server.DaemonStateCoordinator
管理。org.gradle.initialization.SettingsLoader
org.gradle.initialization.DefaultGradleSettingsProcessor
org.gradle.initialization.DefaultProjectDescriptor
// org.gradle.initialization.SettingsLoader
public SettingsInternal findAndLoadSettings() {
File currentDir = startParameter.getCurrentDir();
File settingsFile = findSettingsFile(currentDir);
// 递归向上查找settings.gradle文件
// 若未找到,抛出异常或使用默认配置
}
// org.gradle.initialization.DefaultGradleSettingsProcessor
public SettingsInternal process() {
// 用GroovyShell解析settings.gradle
// 运行include('subproject')等方法
// 生成ProjectDescriptor树
}
// org.gradle.initialization.DefaultProjectDescriptor
public void addProject(String path, File dir) {
ProjectDescriptor descriptor = new DefaultProjectDescriptor(this, path, dir, ...);
children.put(path, descriptor);
}
Project
对象。org.gradle.api.internal.project.ProjectFactory
org.gradle.api.internal.project.DefaultProject
org.gradle.internal.service.DefaultServiceRegistry
// org.gradle.api.internal.project.ProjectFactory
public Project createProject(String name, File projectDir, Project parent, ...) {
// 依赖注入ServiceRegistry,构造DefaultProject
return new DefaultProject(name, projectDir, parent, ...);
}
// org.gradle.internal.service.DefaultServiceRegistry
public <T> T get(Class<T> serviceType) {
// 延迟加载、单例缓存
// 用于插件、脚本等依赖注入
}
// org.gradle.api.internal.project.ProjectRegistry
public void addProject(Project project) {
projectsByPath.put(project.getPath(), project);
rootProject.addChild(project);
}
org.gradle.api.internal.project.DefaultProject
org.gradle.groovy.scripts.ScriptSource
org.gradle.plugin.use.internal.PluginRequestApplicator
// org.gradle.api.internal.project.DefaultProject
public void evaluate() {
// 1. 解析build.gradle为Script对象
Script script = scriptSource.getScript();
// 2. 绑定Project为脚本Delegate
script.setDelegate(this);
// 3. 执行脚本(Groovy动态调用)
script.run();
}
// org.gradle.plugin.use.internal.PluginRequestApplicator
public void applyPlugins(Project project) {
// 解析plugins {} DSL,下载并加载插件
// 插件通过ServiceRegistry注入依赖
}
// build.gradle
task hello {
doLast {
println 'Hello, Gradle!'
}
}
// 实际为:project.getTasks().create('hello').doLast {...}
// org.gradle.api.internal.project.DefaultProject
public void afterEvaluate(Action<Project> action) {
// 注册配置后回调
afterEvaluateActions.add(action);
}
org.gradle.execution.taskgraph.DefaultTaskGraphExecuter
org.gradle.execution.taskgraph.DefaultTaskGraphExecutor
org.gradle.api.internal.AbstractTask
// org.gradle.execution.taskgraph.DefaultTaskGraphExecuter
public void populate() {
// 1. 用户请求的任务如build
// 2. 递归收集所有依赖任务
// 3. 拓扑排序,形成执行序列
}
// org.gradle.execution.taskgraph.DefaultTaskGraphExecutor
public void execute(TaskExecutionGraphInternal graph) {
for (Task task : graph.getAllTasks()) {
task.execute();
}
}
// org.gradle.api.tasks.compile.JavaCompile
@Override
public void compile(JavaCompileSpec spec) {
// 调用Javac编译,参数由build.gradle配置
compiler.execute(spec);
}
// org.gradle.api.internal.AbstractTask
public void execute() {
// doFirst actions
for (Action<? super Task> action : doFirstActions) { action.execute(this); }
// 主体actions
for (Action<? super Task> action : actions) { action.execute(this); }
// doLast actions
for (Action<? super Task> action : doLastActions) { action.execute(this); }
}
// org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter
public void execute(TaskInternal task, TaskStateInternal state, ...) {
if (isUpToDate(task)) {
state.setSkipped(SkipMessage.UP_TO_DATE);
return;
}
// 否则正常执行
}
task.doFirst{}
和task.doLast{}
注册。┌───────────────┐
│ GradleWrapper │
│ GradleMain │
└──────┬────────┘
│
┌──────▼────────┐
│ SettingsLoader│
│ Settings │
└──────┬────────┘
│
┌──────▼────────┐
│ ProjectFactory│
│ Project │
│ ServiceRegistry
└──────┬────────┘
│
┌──────▼────────┐
│ ScriptSource │
│ PluginRequest │
│ DefaultProject│
└──────┬────────┘
│
┌──────▼────────┐
│ TaskGraph │
│ TaskExecutor │
│ JavaCompile │
│ AbstractTask │
└───────────────┘
“参数解析指明路,守护进程优先驻;
settings递归树成型,服务注入项目生;
脚本委托Groovy跑,插件分装类隔离;
依赖成图拓扑序,任务三钩可缓存。”
如需某环节更细的代码实现(如插件ClassLoader机制、任务增量快照算法、守护进程Socket通信细节等),请继续追问!