Android Studio 3.0 开始废弃(obsolete)了很多原有的指令,并使用新的指令来代替它们。目的是为了加快编译构建的速度。
api 指令
完全等同于compile指令,没区别,你将所有的compile改成api,完全没有错。
implementation指令
implementation 与api 的区别在于对外的可见性。这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开。
简单的说,就是使用implementation指令的依赖不会传递。例如,有一个module为mylib,mylib依赖于fastjson:
implementation 'com.alibaba:fastjson:1.2.41'
这时候,在mylib里边的java代码是可以访问fastjson的。另一个module为app,app依赖于mylib:
implementation project(':mylib')
这时候,因为mylib使用的是implementation 指令来依赖fastjson,所以app里边不能引用fastjson。但是,如果mylib使用的是api来引用fastjson:api 'com.alibaba:fastjson:1.2.41'
则与gradle3.0.0之前的compile指令的效果完全一样,app的module也可以引用fastjson,这就是api和implementation的区别。
provided只提供编译支持,但是不会写入apk。使用provide可以避免支持包版本冲突。