gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 05:15:54 27 4
gpt4 key购买 nike

在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,一切都被触发!

现在我有两个问题:
  • 当我们无法独立运行它并且在构建过程中未触发它时,<<任务声明有什么用?
  • 当我仅在“任务”菜单中执行一个任务时,为什么会触发多个任务,然后又如何执行一个任务呢?
  • 最佳答案

    Gradle构建过程分为三个阶段:

  • 初始化-确定要参与构建的项目,并为每个项目创建一个Project实例。
  • 配置-配置项目对象,尤其是要执行的任务。
  • 执行-执行在配置阶段创建和配置的任务的子集。

  • 现在,任务定义包含三个阶段:
    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用户指南中的以下部分:
  • Build Script Basics
  • The Build Lifecycle
  • 关于android-studio - 了解在Gradle中声明任务的不同变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30285871/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com