gradle系列:理解Project.afterEvaluate

本文详细解释了Gradle中afterEvaluate函数的用途及其调用时机。通过实例展示了如何在build.gradle文件中使用afterEvaluate,并说明了它在项目构建过程中的位置,即在所有模块配置完成后调用。

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

在哪里用到了afterEvaluate()?

在app module的build.gradle文件里面,添加如下代码:

afterEvaluate {
    println "afterEvaluta被调用"
}

这里用的Android studio版本是Android Stduio Bumblebee | 2021.1.1 Patch 3, build.gradle文件完整代码如下:

plugins {
    id 'com.android.application'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.gradledemo"
        minSdk 24
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

afterEvaluate {
    println "afterEvaluta被调用"
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.5.0'
    implementation 'com.google.android.material:material:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

看看gradle console里面会打印什么?

afterEvaluate 什么时候被调用?

如下图,项目中使用的是 gradle-7.0.2-all.zip

可以看到afterEvaluate是Project的一个函数。

继续看看官网怎么说?
官网地址:https://docs.gradle.org/current/userguide/userguide.html
文档:org.gradle.api.Project:afterEvaluate(groovy.lang.Closure)

翻译过来就是:

添加在评估Project后立即调用的闭包。
Project作为参数传递给闭包。
当属于此Project的buidl 文件被执行时,这个listener会收到通知。
例如,父项目可以将listener添加到其子项目中。
listener可以根据子项目的build文件运行后的状态进一步配置这些子项目。

Gradle执行的时候遵循如下顺序:

  1. 首先解析settings.gradle来获取模块信息,这是初始化阶段;
  2. 然后配置每个模块,配置的时候并不会执行task;
  3. 配置完了以后,有一个重要的回调project.afterEvaluate,它表示所有的模块都已经配置完了,可以准备执行task了;
  4. 执行指定的task。

备注:如果注册了多个project.afterEvaluate回调,那么执行顺序等同于注册顺序。在上面的例子中,由于buildSrc中的回调注册较早,所以它也先执行。

推荐阅读任玉刚大神的博客:
全面理解Gradle - 执行时序

### 解决 `org.gradle.internal.resolve.ModuleVersionResolveException` 错误 当遇到 `Could not resolve gradle:gradle:8.10.2` 这样的错误时,表明 Gradle 尝试同步依赖项时无法找到指定版本的 Gradle 库。这可能是由于网络连接问题、仓库配置不当或其他原因引起的。 #### 使用 Gradle Wrapper 配置本地 Gradle 版本 为了确保项目使用的 Gradle 版本一致并避免此类问题,建议使用 Gradle Wrapper 来管理项目的 Gradle 版本。具体操作如下: 1. **下载 Gradle All 包** 访问官方 Gradle 发布页面,选择所需的 Gradle 版本(例如:gradle-8.10.2-all.zip),然后下载完整的分发包[^2]。 2. **更新 `gradle-wrapper.properties` 文件** 找到项目根目录下的 `.gradle/wrapper/gradle-wrapper.properties` 文件,并修改其内容以指向新下载的 Gradle 版本: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip ``` 3. **验证 Gradle Wrapper 设置** 可以通过运行以下命令来确认是否正确设置了 Gradle Wrapper: ```bash ./gradlew --version ``` 4. **清理缓存重新同步** 清除旧版 Gradle 缓存数据可以帮助解决问题: ```bash rm -rf $HOME/.gradle/caches/ ``` 5. **调整 Maven 仓库顺序** 如果仍然存在找不到特定库的情况,则可能是因为 Maven 中央仓库或 Google 的 Maven 仓库未被正确访问。尝试调整 `build.gradle` 或者 `settings.gradle` 文件中的 repository 声明位置,使 Google's Maven 放在前面: ```groovy allprojects { repositories { google() mavenCentral() jcenter() // 已废弃但仍可暂时保留用于某些老项目 } } ``` 以上措施应该能够有效处理大多数情况下发生的 `ModuleVersionResolveException` 异常情况[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangjin1120

可靠的文章费时费力,希望支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值