gradle-3-(configure篇)

gradle-3-(configure篇)

1. 入口

DefaultGradleLauncher.java

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();
    }

// 配置操作
private void prepareProjects() {
   
        if (stage == Stage.LoadSettings) {
   
            projectsPreparer.prepareProjects(gradle);
            stage = Stage.Configure;
        }
    }

上述方法prepareProjects就是我们传说中的gradle配置阶段
Configure阶段到底做了什么呢?我看先来看下调用链路

2. 调用链路

上面的projectsPreparer对象其实是来自BuildScropServices类中的createBuildConfigurer方法返回值,也就是BuildOperationFiringProjectsPreparer

BuildScropServices.java
在这里插入图片描述
从上图可以看出,其实是个链式调用(反射调的,不明白可以看篇一),整体结构还是比较清晰的;
因为configure篇东西有点多,先总结下主要流程,后面在详细展开

3. 总结

configure阶段其实大体可以分为三个部分

  1. project的初始化
    • 创建工程中的各个project对象(反射及递归实现,后面会说)
    • 给各工程做些配置(eg,加载gradle.properties属性给每个工程)
  2. buildSrc工程的编译及构建
  3. project的构建脚本(通常是build.gradle)的编译加载

BuildOperationFiringProjectsPreparer其实没做啥事情主要就是代理转发任务,只要看BuildTreePreparingProjectsPreparer即可,它其实就本篇的主要流程,可以看到就是我们上面总结的三大流程

// BuildTreePreparingProjectsPreparer.java 
@Override
public void prepareProjects(GradleInternal gradle) {
   
  // Setup classloader for root project, all other projects will be derived from this.
  SettingsInternal settings = gradle.getSettings();

  ClassLoaderScope settingsClassLoaderScope = settings.getClassLoaderScope();
  ClassLoaderScope buildSrcClassLoaderScope = settingsClassLoaderScope.createChild("buildSrc[" + gradle.getIdentityPath() + "]");
  gradle.setBaseProjectClassLoaderScope(buildSrcClassLoaderScope);
  // 1. attaches root project
  buildLoader.load(gradle.getSettings(), gradle);
  // Makes included build substitutions available
  if (gradle.isRootBuild()) {
   
    buildStateRegistry.beforeConfigureRootBuild();
  }
  // 2. Build buildSrc and export classpath to root project
  buildBuildSrcAndLockClassloader(gradle, buildSrcClassLoaderScope);

  // 3. buildFile的编译与加载
  delegate.prepareProjects(gradle);

  // Make root build substitutions available
  if (gradle.isRootBuild()) {
   
    buildStateRegistry.afterConfigureRootBuild();
  }
}

4. 流程1-init-project

流程1就是代码

buildLoader.load(gradle.getSettings(), gradle);

的内部实现;buildLoader对象的创建其实也是通过调用BuildScopeServices.createBuildLoader方法来实现的
image-20220124164743088

NotifyingBuildLoader ProjectPropertySettingBuildLoader InstantiatingBuildLoader 1. load 2. load 3. load NotifyingBuildLoader ProjectPropertySettingBuildLoader InstantiatingBuildLoader

调用链路非常清晰(装饰器模式)

先看NotifyingBuildLoader

4.1 NotifyingBuildLoader.load干啥了?

先看代码吧

 @Override
    public void load(final 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值