gradle-3-(configure篇)

本文详细剖析了Gradle的配置阶段,包括项目初始化、buildSrc构建、buildFile的编译与加载。重点讨论了NotifyingBuildLoader、ProjectPropertySettingBuildLoader和InstantiatingBuildLoader在项目创建过程中的作用,以及如何应用和编译构建脚本,特别是对gradle.properties的处理。此外,提到了configure阶段的流程,如加载默认工程和插件配置。

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

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 SettingsInternal settings, final GradleInternal gradle) {
   
        final String buildPath = gradle.getIdentityPath().toString();
        buildOperationExecutor.call(new CallableBuildOperation<Void>() {
   
            @Override
            public 
<think>好的,我现在需要帮助用户解决Gradle 8.11.1安装失败的问题,具体错误是UnknownHostException,指向services.gradle.org,可能与代理配置有关。用户提到可能是网络问题或代理设置不正确导致的。我需要结合提供的引用信息和自己的知识来给出解决方案。 首先,用户遇到的错误是UnknownHostException,这说明在解析services.gradle.org的域名时出现问题。可能的原因包括DNS配置错误、网络连接问题、代理设置不正确,或者防火墙阻止访问。根据用户提到的代理配置,这可能是一个关键点。 参考引用[3]中提到的下载Gradle失败的问题,解决方案包括检查代理设置和手动下载Gradle。这可能也适用于当前的情况。用户可能需要在Android Studio中配置正确的代理,或者检查系统级的代理设置。 接下来,用户可能需要手动下载Gradle分发版,并放置到正确的目录中,这样可以绕过自动下载的问题。这在引用[3]中也有提到,手动下载并放到gradle/wrapper目录下。 另外,引用[4]中提到检查项目的build.gradle文件和Gradle版本,可能需要确认Gradle版本与Android Studio的兼容性,但当前问题更可能集中在网络或代理配置上。 需要分步骤指导用户检查代理设置,包括Android Studio内部和系统的环境变量,然后测试网络连接,最后提供手动安装的步骤。同时,提醒用户检查防火墙或杀毒软件是否拦截请求,以及DNS设置是否正确。 需要确保建议清晰,步骤详细,用户能够逐步操作。可能还需要解释如何修改gradle-wrapper.properties文件来使用本地分发版。 最后,生成相关问题,帮助用户进一步排查可能的问题,比如其他常见错误或版本兼容性问题。</think>针对Gradle 8.11.1安装失败并出现`UnknownHostException`的问题,以下是分步骤解决方案: ### 1. 检查代理配置 - **Android Studio代理设置**: 进入 `File > Settings > Appearance & Behavior > System Settings > HTTP Proxy`,选择`Manual proxy configuration`,填入正确的代理地址和端口(需与系统代理一致)。完成后点击`Check connection`测试能否访问`https://services.gradle.org`[^3][^4]。 - **系统环境变量**: 在系统变量中添加`HTTP_PROXY`和`HTTPS_PROXY`,例如: ```bash HTTP_PROXY=http://proxy.example.com:8080 HTTPS_PROXY=http://proxy.example.com:8080 ``` ### 2. 手动下载Gradle分发版 1. 访问[Gradle官方仓库](https://services.gradle.org/distributions/)下载`gradle-8.11.1-bin.zip` 2. 将文件复制到项目的`gradle/wrapper`目录(例如`~/.gradle/wrapper/dists/gradle-8.11.1-<hash>`) 3. 修改`gradle-wrapper.properties`文件,确保配置指向本地文件: ```properties distributionUrl=gradle-8.11.1-bin.zip ``` ### 3. 网络诊断 - 使用终端执行`ping services.gradle.org`检查域名解析 - 执行`curl -v https://services.gradle.org`查看详细连接过程,确认是否被防火墙拦截[^3]。 ### 4. 清除Gradle缓存 删除`~/.gradle`目录下的缓存文件,重新同步项目触发纯净安装。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值