Gradle系列之Gradle基础

本文详细介绍了Gradle的工作流程,包括Initialization、Configuration和Execution三个阶段。此外,还深入探讨了Gradle的核心内容,如project对象、task的创建、行为、依赖关系及其配置。文章还讨论了gradle build过程中的各种回调函数,帮助读者理解Gradle构建的内部机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值