一、依赖变化
当我们使用Android Studio3.X新建项目时会发现,默认的依赖由之前的compile
更改为implementation
了。
3.0 以下版本build.gradle中依赖的写法:
compile fileTree(dir: 'libs', include: ['*.jar'])
但在3.0后的写法为
implementation fileTree(dir: 'libs', include: ['*.jar'])
或
api fileTree(dir: 'libs', include: ['*.jar'])
二、区别
在3.X版本中,compile
指令被标注为过时方法,而新增了两个依赖指令,一个是implementation
和api
,这两个都可以进行依赖添加,但是有什么区别呢?
api
完全等同于compile
指令,没区别,你将所有的compile
改成api
,完全没有错。
implementation
这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。
示例
比如我在一个library
中使用implementation
依赖了gson
库,然后我的主项目依赖了library
,那么,我的主项目就无法访问gson
库中的方法。这样的好处是编译速度会加快,推荐使用implementation
的方式去依赖,如果你需要提供给外部访问,那么就只能使用api
方式了。
在Google IO
相关话题的中提到了一个建议,就是依赖首先应该设置为implementation
的,如果没有错,那就用implementation
,如果有错,那么使用api
指令,这样会使编译速度增快。
三、说明
下面是2.x
版本依赖的说明,括号里对应的是3.x
版本的依赖方式。
compile(api)
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
provided(compileOnly)
只在编译时有效,不会参与打包,可以在自己的moudle
中使用该方式依赖。比如com.android.support
,gson
这些使用者常用的库,避免冲突。
apk(runtimeOnly)
只在生成apk
的时候参与打包,编译时不会参与,很少用。
testCompile(testImplementation)
testCompile
只在单元测试代码的编译以及最终打包测试apk
时有效。
debugCompile(debugImplementation)
debugCompile
只在debug
模式的编译和最终的debug apk
打包时有效。
releaseCompile(releaseImplementation)
releaseCompile
仅仅针对Release
模式的编译和最终的Release apk
打包。