If I am not wrong gradle assemble
does run gradle assembleDebug
and gradle assembleRelease
, but I believe gradle build
also does the same, so what are the different between them both?
Gradle Tasks In Gradle, Task is a single unit of work that a build performs. These tasks can be compiling classes, creating a JAR, Generating Javadoc, and publishing some archives to a repository and more. It can be considered as a single atomic piece of work for a build process.
Assemble is for creating artifacts (eg WAR or JAR) from the various components, classpaths, resource files, etc.
Assemble is a lifecycle task with no actions attached. Lifecycle tasks often combine other tasks and are useful to run in your development workflow. The purpose of assemble is to combine all tasks which produce a distribution or artifact into a single task.
By default, Gradle will run all tests that it detects, which it does by inspecting the compiled test classes. This detection uses different criteria depending on the test framework used. For JUnit, Gradle scans for both JUnit 3 and 4 test classes.
assemble
will build your artifacts, and build
will assemble your artifacts with additional checks.
build
depends on assemble
, so build
is sort of a superset of assemble
You can have a look on the tasks that will be executed by using the --dry-run
flag. e.g.
gradlew build --dry-run
You will see that apart from assemble
also lint
and test
will be executed.
From gradle tasks --all
:
Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
build
is effectively assemble
+ check
(and check
is test
+ any linting tasks).
It's true that according to gradle tasks
it looks like the build
is a superset of assemble
, including tests.
But(!) from my short experience it really looks like it's not the case.
So I ran those 2 commands in the command line using the gradle wrapper with --scan flag after running clean every time. This is the comparison:
assembleDebug
I got all the built files i wanted - *.apk
and *.aar
files.buildDebug
I didn't have any of those files.assembleDebug
- 109 tasksbuildDebug
- 91 tasksassembleDebug
- 172 from 20 configurationsbuildDebug
- 104 from 18 configurationsassembleDebug
in 2 of my 3 sub projects (which are java libraries, not app) there is one more configuration, called lintClassPath
. This configuration is missing in buildDebug
.buildDebug
didn't call assembleDebug
task and assembleDebug
didn't call buildDebug
tasks.Build -> Make Project
), I see in my scan that the command that actually ran was the assembleDebug
. More specifically, it ran :app:assembleDebug
.As you can see, I don't really understand the differences myself, but this is what I found out. If someone can explain it to me and the other users reading here, it could be awesome :) Thanks!
There is conflicting information about whether build
is supposed to depend on assemble
.
On one hand, Understanding Gradle: the Build Lifecycle shows a graph of task dependencies from where build
and assemble
are independent:
In contrast, the Gradle user guide for Java plugin shows that build
depends on assemble
, at least for Java projects:
This contradicts the graph from "Understanding Gradle." So perhaps the Android plugin implements build/assemble tasks differently from the Java plugin? Or, this behavior changed in some version of Gradle.
Assemble will build your artifacts, and build will assemble your artifacts with additional checks.
What additional checks? I run the tasks so you don't have to:
: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
As you can see, build
does execute more tasks than assemble
. Like lint
, test
, and check
tasks.
You can refer the full tasks here
The original text is build
task while the changed text is assemble
task.
Project used: Android Sunflower GitHub
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With