首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何控制Android的build.gradle中的任务执行顺序?

如何控制Android的build.gradle中的任务执行顺序?
EN

Stack Overflow用户
提问于 2020-11-30 16:58:50
回答 1查看 1.3K关注 0票数 1

我正在使用AndroidStudio4.1和Gradle 6.7.1

(请注意,"mergeReleaseAssets“不是我的自定义任务,它是系统任务的一部分,我不知道在哪里可以找到”mergeReleaseAssets“的定义)

我想将任务"mergeReleaseAssets“设置为在"myTask”之后执行,如下所示:

代码语言:javascript
运行
复制
...
> Task :app:myTask
...
(no matter how many tasks in the middle should be ok)
...
> Task :app:mergeReleaseAssets
...

build.gradle:中的任务定义

代码语言:javascript
运行
复制
...
task myTask {
    doLast {
        println String.format("put something in the assets")
    }
}
tasks.withType(JavaCompile) { t -> t.finalizedBy myTask }
...

当通过单击Menubar -> "Build“->”重构项目“构建项目时,任务执行顺序并不总是相同的,似乎任务是并行执行的。

第一次生成输出:

代码语言:javascript
运行
复制
Executing tasks: [clean, :app:assembleRelease] in project /home/testproject

> Task :clean UP-TO-DATE
> Task :app:clean UP-TO-DATE
> Task :app:preBuild UP-TO-DATE
> Task :app:preReleaseBuild UP-TO-DATE
> Task :app:compileReleaseAidl NO-SOURCE
> Task :app:compileReleaseRenderscript NO-SOURCE
> Task :app:generateReleaseBuildConfig
> Task :app:checkReleaseAarMetadata
> Task :app:generateReleaseResValues
> Task :app:generateReleaseResources
> Task :app:createReleaseCompatibleScreenManifests
> Task :app:extractDeepLinksRelease
> Task :app:processReleaseMainManifest
> Task :app:processReleaseManifest
> Task :app:processReleaseManifestForPackage
> Task :app:mergeReleaseResources
> Task :app:processReleaseResources
> Task :app:mergeReleaseNativeDebugMetadata NO-SOURCE
> Task :app:mergeReleaseShaders
> Task :app:javaPreCompileRelease

> Task :app:compileReleaseJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

> Task :app:myTask
> Task :app:compileReleaseSources
> Task :app:lintVitalRelease
> Task :app:compileReleaseShaders NO-SOURCE
> Task :app:generateReleaseAssets UP-TO-DATE
> Task :app:mergeReleaseAssets
> Task :app:compressReleaseAssets
> Task :app:dexBuilderRelease
> Task :app:checkReleaseDuplicateClasses
> Task :app:processReleaseJavaRes NO-SOURCE
> Task :app:collectReleaseDependencies
> Task :app:sdkReleaseDependencyData
> Task :app:mergeReleaseJniLibFolders
> Task :app:mergeReleaseNativeLibs
> Task :app:stripReleaseDebugSymbols NO-SOURCE
> Task :app:validateSigningRelease
> Task :app:mergeReleaseJavaResource
> Task :app:desugarReleaseFileDependencies
> Task :app:mergeExtDexRelease
> Task :app:mergeDexRelease
> Task :app:packageRelease
> Task :app:assembleRelease

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 2m 0s
32 actionable tasks: 30 executed, 2 up-to-date

Build Analyzer results available

第二次生成输出:

代码语言:javascript
运行
复制
Executing tasks: [clean, :app:assembleRelease] in project /home/testproject

> Task :clean UP-TO-DATE
> Task :app:clean UP-TO-DATE
> Task :app:preBuild UP-TO-DATE
> Task :app:preReleaseBuild UP-TO-DATE
> Task :app:compileReleaseAidl NO-SOURCE
> Task :app:compileReleaseRenderscript NO-SOURCE
> Task :app:generateReleaseBuildConfig
> Task :app:checkReleaseAarMetadata
> Task :app:generateReleaseResValues
> Task :app:generateReleaseResources
> Task :app:javaPreCompileRelease
> Task :app:createReleaseCompatibleScreenManifests
> Task :app:extractDeepLinksRelease
> Task :app:processReleaseMainManifest
> Task :app:processReleaseManifest
> Task :app:processReleaseManifestForPackage
> Task :app:mergeReleaseNativeDebugMetadata NO-SOURCE
> Task :app:mergeReleaseShaders
> Task :app:compileReleaseShaders NO-SOURCE
> Task :app:generateReleaseAssets UP-TO-DATE
> Task :app:mergeReleaseAssets
> Task :app:compressReleaseAssets
> Task :app:checkReleaseDuplicateClasses
> Task :app:processReleaseJavaRes NO-SOURCE
> Task :app:mergeReleaseResources
> Task :app:processReleaseResources
> Task :app:mergeReleaseJavaResource

> Task :app:compileReleaseJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

> Task :app:desugarReleaseFileDependencies
> Task :app:myTask
> Task :app:compileReleaseSources
> Task :app:lintVitalRelease
> Task :app:dexBuilderRelease
> Task :app:collectReleaseDependencies
> Task :app:sdkReleaseDependencyData
> Task :app:mergeReleaseJniLibFolders
> Task :app:validateSigningRelease
> Task :app:mergeReleaseNativeLibs
> Task :app:stripReleaseDebugSymbols NO-SOURCE
> Task :app:mergeExtDexRelease
> Task :app:mergeDexRelease
> Task :app:packageRelease
> Task :app:assembleRelease

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.7.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1m 54s
32 actionable tasks: 30 executed, 2 up-to-date

Build Analyzer results available

你可以第一次看到,的顺序是"myTask“-> . -> "mergeReleaseAssets”,,但是第二次,它改为“mergeReleaseAssets”-> . -> "myTask".

然后,我尝试在build.gradle中设置任务依赖项:

代码语言:javascript
运行
复制
project.getTasks().getByName("mergeReleaseAssets").dependsOn(myTask)
//This also not work
//project.getTasks().getByName(":app:mergeReleaseAssets").dependsOn(myTask)

但Android显示错误:

代码语言:javascript
运行
复制
Task with name "mergeReleaseAssets" not found in project ':app'

//Or this error if using ":app:mergeReleaseAssets":
Task with name ":app:mergeReleaseAssets" not found in project ':app'

帮帮忙,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-01 08:14:45

问题是mergeReleaseAssets任务是动态创建的,因此不能在build.gradle脚本中直接引用它。

一个解决方案是使用Project.afterEvaluate生命周期挂钩,如所描述的这里

代码语言:javascript
运行
复制
project.afterEvaluate{ 
    // at this stage, task 'mergeReleaseAssets' has been declare, you can reference it to perform additional configuration
    project.getTasks().getByName("mergeReleaseAssets").dependsOn(myTask) 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65077890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档