Android Studio中Gradle依赖项配置

Gradle 3.4 引入了新的 Java 库插件配置,允许您控制到编译和运行时类路径的发布(适用于模块间依赖项)。 Android 插件 3.0.0 正在迁移到这些新依赖项配置。 要迁移您的项目,只需更新您的依赖项以使用新配置,而非已弃用配置,如下表中所列:

新配置(3.0后) 弃用配置(3.0前) 说明 作用
implementation compile 依赖项在编译时对模块可用,并且仅在运行时对模块的消费者可用。 对于大型多项目构建,使用implementation而不是api/compile可以显著缩短构建时间,因为它可以减少构建系统需要重新编译的项目量。 大多数应用和测试模块都应使用此配置。 使用implementation方式来依赖项目或库,该库在编译时,只对当前的module可见,对其他的module不可见。
api compile 依赖项在编译时对模块可用,并且在编译时和运行时还对模块的消费者可用。 此配置的行为类似于compile(现在已弃用),一般情况下,您应当仅在库模块中使用它。 应用模块应使用implementation,除非您想要将其 API 公开给单独的测试模块。 使用api方式来依赖项目或库,该库在编译和运行时都可以对其他module可见。
compileOnly provided 依赖项仅在编译时对模块可用,并且在编译或运行时对其消费者不可用。 此配置的行为类似于provided(现在已弃用)。 使用compileOnly方式来依赖项目或库,该库仅在编译时有效可用。
runtimeOnly apk 依赖项仅在运行时对模块及其消费者可用。 此配置的行为类似于apk(现在已弃用)。 使用runtimeOnly方式来依赖项目或库,该库仅在运行时有效可用。

Gralde插件 3.0之前的 build.gradle文件中依赖项默认都是compile

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])  
    compile 'com.android.support:appcompat-v7:25.1.1'       
    compile project(':mylibrary')
    compile files('libs/gson-2.8.jar')
    testCompile 'junit:junit:4.12'  
}

Gralde插件 3.0之后的 build.gradle文件中依赖项默认是implementation

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])  
    implementation 'com.android.support:appcompat-v7:25.1.1'        
    implementation project(':mylibrary')
    implementation files('libs/gson-2.8.jar')
    testImplementation 'junit:junit:4.12'   
}
依赖方式图
1. Gradle依赖配置指令
  • implementation(compile):只在内部使用此module,不会向外部暴露其依赖的module内容。
  • api(compile):和 compile 的作用一样,当前module会暴露其依赖的其他module内容。使用该方式依赖的库将会参与编译和打包。
  • compileOnly(provided):使用该方式依赖的库只在编译时有效,不会参与打包 。
  • runtimeOnly(apk):使用该方式依赖的库只在生成apk的时候参与打包,编译时不会参与。
  • testImplementation(testCompile): 只在单元测试代码的编译以及最终打包测试apk时有效。
  • debugImplementation(debugCompile):只在debug模式的编译和最终的debug apk打包时有效。
  • releaseImplementation(releaseCompile):仅仅针对Release 模式的编译和最终的Release apk打包。
2. implementation 和 api的区别

implementation:该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开,不具有依赖的传递性。gradle构建速度比api要快。
api: 等同于compile指令,该操作命令会修改外部接口,module和所有依赖的module都需要重新编译,具有依赖传递性。gradle构建速度比implementation慢。

在Google IO 相关话题的中提到了一个建议,就是依赖首先应该设置为implement的,如果没有错,那就用implement;如果有错,那就改用api,这样会使编译速度有所增快。

参考

Gradle配置文档,开启传送门

禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容