在讲代码隔离之前,先大致看一下 gradle3.0.0 对添加依赖的语法变化。
首先 compile 被废弃了,而是分成了两个:implementation 和 api,其中 api 与之前的 compile 功能基本一致,不再赘述;implementation 就比较高级了,其作用就是,使用 implementation 添加的依赖不会再编译期间被其他组件引用到,但在运行期间是完全可见的。这也是一种代码隔离。举个例子,
- 组件A依赖lib1,既A implementation lib1
- 组件B依赖组件A,既B api A
在 gradle3.0.0 之前,B是完全可以引用到 lib1 里面的类的,但是现在B在编译期间就做不到了,只能在运行期可以。这种思想有点类似于“下属的下属不是你的下属”的思想。但是这种隔离在组件之间是不起作用的,在上面的例子中A的所有类对B还是完全可见的,也就是没有做任何隔离的。不过 implementation 的确是一种有效减少编译时间的方式,还是上面的例子,lib1发生了变化,现在只需要编译A就可以了,而在之前B有可能也使用到了lib1,所以需要同时编译B和A。按照官方建议,大部分情况下都应该使用 implementation 来进行添加依赖。
此外还有两种变化,原来的 apk 语法被 runtimeOnly 取代,provided 被 compileOnly 取代,其作用还是没变。上文也讲了,runtimeOnly 有个极大的改动就是可以支持aar了,但是 compileOnly 还是只能支持 jar!
先做一个小结,目前 gradle3.0.0 的四种语法的功能和代码隔离效果见下图:
从上图可以看出,在代码隔离效果上,runtimeOnly 的效果是最好的!但是就可以直接使用了吗,答案是否定的。
来源: https://mp.weixin.qq.com/s/kr4SqGcTnWmsQMwHHbLCrw