gradle系列:理解Project.afterEvaluate

Posted zhangjin1120

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gradle系列:理解Project.afterEvaluate相关的知识,希望对你有一定的参考价值。

目录

在哪里用到了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 - 执行时序

以上是关于gradle系列:理解Project.afterEvaluate的主要内容,如果未能解决你的问题,请参考以下文章

build.gradle系列:apply plugin: ‘com.android.application‘ 语法理解

Gradle入门系列:简介

Gradle 系列博客汇总

原创 | 看完此文,你对Gradle的理解又升级了!

理解使用Gradle编译打包Android apk

Gradle学习系列之一——Gradle快速入门