了解在Gradle中声明任务的不同变体

时间:2015-05-17 10:27:28

标签: android-studio gradle task android-gradle build.gradle

在Gradle中声明任务有两种不同的变体。

1

task myTask() {}

2

task task3 << {}

为了测试他们的行为方式,我创建了一个示例android项目

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.android.gradletest"
        minSdkVersion 15
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.1.1'
}



task task1() {
    println "Task 1"
}

task task2() {
    println "Task 2"
}

task task3 << {
    println "Task 3"
}

task task4() {
    println "Task 4"
}

第一次尝试正在执行任务1

Task 1
Task 2
Task 4
:app:task1 UP-TO-DATE

BUILD SUCCESSFUL

Total time: 6.462 secs

Process finished with exit code 0

如您所见,不仅仅执行了任务1,而且完成了没有任务3的构建。

第二次尝试直接运行任务3:

Task 1
Task 2
Task 4
:app:task3
Task 3

BUILD SUCCESSFUL

Total time: 6.577 secs

Process finished with exit code 0

结果又一次,完整的构建似乎被触发了,但这次是在任务3结束时。

第三次尝试只是通过按Android Studio的运行按钮构建完整的项目

Task 1
Task 2
Task 4
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72211Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42211Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:processDebugJavaRes UP-TO-DATE
:app:compileDebugJava
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:preDexDebug
:app:dexDebug
:app:validateDebugSigning
:app:packageDebug
:app:zipalignDebug
:app:assembleDebug
Information:BUILD SUCCESSFUL

正如您所看到的,除了任务3之外,所有内容都会被触发!

现在我有两个问题:

  1. 什么是&lt;&lt;任务声明,当我们无法独立运行它时,它不会在构建过程中触发吗?
  2. 当我执行任务菜单中的一个时,为什么它会触发多个任务?如何执行一个任务? enter image description here

1 个答案:

答案 0 :(得分:1)

Gradle构建经历了3个阶段:

  1. 初始化 - 确定哪些项目将参与构建,并为每个项目创建一个Project实例。
  2. 配置 - 配置项目对象,特别是要执行的任务。
  3. 执行 - 执行在配置阶段创建和配置的任务子集。
  4. 现在,任务定义包含3个阶段:

    task myTask {
        // Configuration scope
        // will be executed during the configuration phase
    
        doFirst {
            // Will be executed during the execution phase before the task defined behavior
        }
    
        doLast {
            // Will be executed during the execution phase after the task defined behavior
        } 
    }
    

    因此,当您定义这样的任务时:

    task task1() {
        println "Task 1"
    }
    

    由于println语句是配置范围的一部分,因此无论是否选择执行此任务,它都将在配置阶段执行。

    现在,使用<<运算符来定义任务实际上是为任务定义doLast闭包的快捷方式,即

    task task3 << {
        println "Task 3"
    }
    

    相当于:

    task task3 {
        doLast {
            println "Task 3"
        }
    }
    

    然后,根据我上面的解释,在这种情况下,println语句将仅在执行阶段执行,以防必须按照在配置阶段确定的task3执行。

    如果您有兴趣了解详情,我强烈建议您阅读Gradle用户指南中的以下部分:

    1. Build Script Basics
    2. The Build Lifecycle