新旧指令对比
Android Studio 2.X | Android Studio 3.X |
apk | runtimeOnly |
provided | compileOnly |
compile | api |
implementation | |
debugCompile | debugImplementation |
releaseCompile | releaseImplementation |
testCompile | testImplementation |
androidTestCompile | androidTestImplementation |
apk & runtimeOnly
只在生成apk的时候参与打包,编译时不会参与
provided & compileOnly
provided只提供编译支持,但是不会写入apk。使用provide可以避免支持包版本冲突。
compile & api、implementation
compile 是和 api 对应的,两者效果相同。
api 与 implementation 的区别在于对外的可见性。
例如:
A api B,B api C
那么 A 模块不仅可以引用 B 模块,还可以引用 C 模块的接口和类。
A implementation B,B implementation C
那么 A 模块只能引用 B 模块的接口和类,不能引用 C 模块,也就是说 C 对于 A 是不可见的。这样做的好处是提高了编译和链接的速度。
testCompile(testImplementation)
testCompile 只在单元测试代码时有效。
debugCompile(debugImplementation)
debugCompile 只在debug模式的编译和最终的debug apk打包时有效
releaseCompile(releaseImplementation)
Release compile 仅仅针对Release 模式的编译和最终的Release apk打包。
一、implementation & api依赖配置的对比
- 被引入的依赖模块,简称
依赖模块
- 引入了被依赖模块的当前模块,简称
当前模块
- 依赖了当前模块的上层模块,简称
其他上层模块
1、implementation
此依赖配置,使Gradle意识到,当前模块
引入的依赖模块
,在编译期间对其他上层模块
不可见,仅在运行时对其他上层模块
可见。这将会加快多模块依赖的项目整体编译速度,因为通过implementation
引入的依赖模块
,如果依赖模块
内部有进行过Api的改动,由于其对其他上层模块
不可见,因此只需重新编译依赖模块
自身以及使用到此改动的Api的当前模块
即可。
2、api
等同于原有的compile
,此依赖配置,使Gradle意识到,其引入的依赖模块
,无论在编译期还是在运行时,都对其他上层模块
可见,即通过api
配置引入的依赖模块
,在依赖关系上具有传递性。这将会使得其他上层模块
可以直接使用依赖模块
的Api,但这同时意味着一旦依赖模块
发生Api的改动,将导致所有已经使用了此依赖模块
改动了的Api的上层模块都需要重新执行编译。因此,一般会加大整个项目的编译时间,如非必要,一般建议优先使用implementation
依赖配置。
新增类,新增或修改非private的对外方法名等,在api引入的方式下,都会使得上层模块重新编译,因为上层模块可能会直接用到此类方法,但在上层模块的实际编译过程中,并不会对模块内的类都进行重新编译,而是只会编译确实已经使用了依赖模块的API的类。
项目中引入的
marven
库中的构件,其内部的依赖配置对当前项目的Gradle
是失效的。
例如:
- :app
api
依赖 :LibB- :LiB
api
依赖 :LibD- :LibD
api
依赖了marven
库中的构件 :LibX- :LibX项目内部
implementation
依赖了marven
库中的另一构件 :LibY
此时,LibD依然可以直接使用LibY中的对外Api
,也就是说,此时即使:LibX项目通过implementation
引入的:LibY,但:LibY对:LibD 依然具有依赖传递,具有可见性。
总结:
implementation
和api
依赖配置主要是控制依赖模块
对上层模块的依赖关系传递及可见性,在实际进行项目构建时,编译期和运行时,又可能具有不同的依赖传递关系。理解不同的依赖配置,对具体的编译期和运行时的依赖关系具有重要意义,也是解决依赖冲突等问题的关键。
二、dependencies {} 语块的简单写法
1、新建config.gradle
ext { supportLibrary = "28.0.0" // 第三方库 dependecies = [ appcompat : "com.android.support:appcompat-v7:${supportLibrary}", constraint: "com.android.support.constraint:constraint-layout:1.1.3" ] }
2、在全局项目(rootPrejec)中的build.gradle文件中头部引入
apply from:"config.gradle"
3、在子项目中的dependencies语块中引用自定义的数组变量
def support = rootProject.ext.dependeciesdependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) support.each { k, v -> implementation v} }
参考文献:
https://www.cnblogs.com/lwbqqyumidi/p/10256690.html
https://blog.youkuaiyun.com/chy555chy/article/details/85134165