gradle组装和gradle构建任务之间有什么区别?


78

如果我没有记错gradle assemble,运行gradle assembleDebuggradle assembleRelease,但是我相信gradle build也一样,那么两者之间有何不同?


2
当我运行时,buildRelease我没有得到.apk文件,只有日志文件。但是,在运行时assembleRelease,我确实获得了.apk文件。奇。
约书亚·品特

Answers:


97

组装将构建您的工件,并且构建将通过附加检查来组装您的工件。

build取决于assemble,所以build是的超集assemble

您可以使用该--dry-run标志查看将要执行的任务。例如

gradlew build --dry-run

你会看到,除了assemblelinttest将被执行。


3
谢谢你的回答。我相信使用--dry-run跑步是进一步了解的方式
谦虚的学生,

您所说的“额外检查”是什么意思
Ajay S

3
@AjaySlinttest
David Medenjak

2
根据我的上次经验,这个答案是错误的。当我运行assembleRelease时,我得到输出apk。当我运行buildRelease时,不会生成apk。另外,如上所述,我使用--dry-run来运行这两个任务,并且似乎build不在下面运行。
rideronthestorm

我想知道Android插件与Java插件实现的构建/组装方式是否不同。我刚刚发布了这个问题的答案,其中显示了两个相互矛盾的图表。但是一个正在讨论Android,另一个正在讨论Java。
Colin D Bennett


13

的确,根据gradle tasks它看起来build是的超集assemble,包括测试。但是(!)从我的短暂经验来看,事实并非如此。

因此,每次运行干净后,我都使用带有--scan标志的gradle包装器在命令行中运行了这2条命令。这是比较:

  1. 所需的构建文件:
    • 运行后,assembleDebug我得到了所有想要的构建文件-*.apk*.aar文件。
    • 运行后,buildDebug我没有任何这些文件。
  2. 根据扫描运行的任务数量:
    • assembleDebug -109个任务
    • buildDebug -91项任务
  3. 根据扫描的依赖项数量:
    • assembleDebug -172(来自20种配置)
    • buildDebug -18种配置中的104种
    • 看来它们之所以不同,是因为在assembleDebug我的3个子项目中的2个(它们是Java库,而不是app)中,有两个配置叫做lintClassPath。中缺少此配置buildDebug
  4. 还要提到的另一点是,当我在任务列表中搜索时,似乎buildDebug没有调用assembleDebug任务,assembleDebug也没有调用buildDebug任务。
  5. 在这种情况下要提到的最后一个有趣的事情是,当我从Android Studio(Build -> Make Project)运行构建时,我在扫描中看到实际运行的命令是assembleDebug。更具体地说,它运行了:app:assembleDebug

如您所见,我自己并不是很了解这些差异,但这就是我发现的。如果有人可以向我和其他在这里阅读的用户解释它,那可能会很棒:)谢谢!


7

关于是否build应该依赖的信息存在冲突assemble

一方面,《理解Gradle:构建生命周期》显示了一个任务依赖关系图,这些任务依赖于buildassemble相互独立: Android Gradle Recipes一书中的Java插件任务的有向无环图。

相比之下,Gradle Java插件用户指南显示至少build依赖于assembleJava项目,它取决于:

Java插件-任务

这与“了解Gradle”中的图相矛盾。那么,也许Android插件与Java插件实现的构建/组装任务不同?或者,此行为在某些版本的Gradle中已更改。


构建依赖于两个检查和所看到的代码组合:github.com/gradle/gradle/blob/...
亨里克·诺德维克

0

组装将构建您的工件,并且构建将通过附加检查来组装您的工件。

还有哪些其他检查?我运行任务,因此您不必:

:app:lint SKIPPED       
:app:bundleDebugClasses SKIPPED     
:app:kaptGenerateStubsDebugUnitTestKotlin SKIPPED       
:app:kaptDebugUnitTestKotlin SKIPPED        
:app:compileDebugUnitTestKotlin SKIPPED     
:app:preDebugUnitTestBuild SKIPPED      
:app:javaPreCompileDebugUnitTest SKIPPED        
:app:compileDebugUnitTestJavaWithJavac SKIPPED      
:app:processDebugUnitTestJavaRes SKIPPED        
:app:testDebugUnitTest SKIPPED      
:app:bundleReleaseClasses SKIPPED       
:app:kaptGenerateStubsReleaseUnitTestKotlin SKIPPED     
:app:kaptReleaseUnitTestKotlin SKIPPED      
:app:compileReleaseUnitTestKotlin SKIPPED       
:app:preReleaseUnitTestBuild SKIPPED        
:app:javaPreCompileReleaseUnitTest SKIPPED      
:app:compileReleaseUnitTestJavaWithJavac SKIPPED        
:app:processReleaseUnitTestJavaRes SKIPPED      
:app:testReleaseUnitTest SKIPPED        
:app:test SKIPPED       
:app:check SKIPPED      
:app:build SKIPPED

如您所见,build与执行的任务相比,执行的任务更多assemble。像linttestcheck任务。

您可以在此处引用完整的任务 。原始文本是buildtask,而更改后的文本是assembletask。

使用的项目:Android Sunflower GitHub

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.