官方依赖说明文档参考
应用模块的 build.gradle 文件中包含三种不同类型的依赖项:
apply plugin: 'com.android.application'
android { ... }
dependencies {
// Dependency on a local library module
implementation project(":mylibrary")
// Dependency on local binaries
implementation fileTree(dir: 'libs', include: ['*.jar'])
//或者,您也可以按如下方式指定各个文件:
implementation files(‘libs/foo.jar’,‘libs/bar.jar’)
// Dependency on a remote binary
implementation 'com.example.android:app-magic:12.3'
}
Android Studio3.0 正式版相比 2.x 的版本,Gradle版本升级为了3.x,编译速度也提高了不少。
在gadle3.0之后,默认的依赖由之前的compile更改为implementation了。
先来看下2.x版本的依赖方式:
再来看看3.0的
可以看到在gradle3.0中,compile依赖关系已被弃用,被implementation和api替代,provided被compile only替代,apk被runtime only替代,剩下的看名字就知道了。
我们先来看看implementation和api的区别:
api:跟2.x版本的 compile完全相同,当一个模块包含 api 依赖项时,会让 Gradle 了解该模块要以传递方式将该依赖项导出到其他模块,以便这些模块在运行时和编译时都可以使用该依赖项。
implementation:当您的模块配置 implementation 依赖项时,会让 Gradle 了解您不希望该模块在编译时将该依赖项泄露给其他模块。也就是说,其他模块只有在运行时才能使用该依赖项。比如我在一个libiary中使用implementation依赖了gson库,然后我的主项目依赖了libiary,那么,如果此时修改了 gson 库的版本号,那么在重新编译项目期间我的主项目就无法访问gson库中的方法。这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,如果你需要在编译和运行时都提供给外部访问,那么就使用api依赖即可。
还不熟悉2.x版本依赖的可以看看下面的说明,括号里对应的是3.0版本的依赖方式。
compile(implementation,api)
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
implementation:该依赖方式所依赖的库不会传递,只会在当前module中生效。
api:该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下使用api依赖的库。
当我们依赖一些第三方的库时,可能会遇到com.android.support冲突的问题,就是因为开发者使用的compile或api依赖的com.android.support包与我们本地所依赖的com.android.support包版本不一样,所以就会报All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes这个错误。
解决办法参考
provided(compileOnly)
只在编译时有效,不会参与打包。Gradle 只会将依赖项添加到编译类路径(也就是说,不会将其添加到构建输出)。如果您创建 Android 模块时在编译期间需要相应依赖项,但它在运行时可有可无,此配置会很有用。
可以在自己的moudle中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。
如果您使用此配置,那么您的库模块必须包含一个运行时条件,用于检查是否提供了相应依赖项,然后适当地改变该模块的行为,以使该模块在未提供相应依赖项的情况下仍可正常运行。这样做不会添加不重要的瞬时依赖项,因而有助于减小最终 APK 的大小。
apk(runtimeOnly)
只在生成apk的时候参与打包,编译时不会参与,很少用。Gradle 只会将依赖项添加到构建输出,以便在运行时使用。也就是说,不会将其添加到编译类路径。
testCompile(testImplementation)
testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。
debugCompile(debugImplementation)
debugCompile 只在debug模式的编译和最终的debug apk打包时有效
releaseCompile(releaseImplementation)
Release compile 仅仅针对Release 模式的编译和最终的Release apk打包。