Inside a dependency block, we can declare a library dependency using one of several dependency configurations. The following table shows the differences between them.
| configuration | behavior | advantage |
|---|---|---|
| implementation | exist in compile time classpath and build output but only visible to other modules at runtime | significantly reduce build time |
| api | just like implementation, but transtively export to other modules | if using too much, it will sigificantly increase build time |
| compileOnly | only exists in compile time | reduce the final apk size by not adding transient dependencies that aren’t critical |
| runtimeOnly | only exists in runtime, in build output | |
| annotationProcessor | if the dependency is an annotation processor |