Android gradle 配置 implementation 和 api
随着 AS3.0 版本的升级,gradle 插件也升级为3.0.0,本文重点关注 gradle3.0.0 对代码的隔离功能。
1、首先看一下gradle 3.0.0 的四种语法功能和代码隔离的效果
3.0语法 | 旧语法 | 功能 | 支持类 | 代码隔离效果 |
---|---|---|---|---|
implementation | compile | 编译期间对其他组件不可见,运行期间可见 | jar aar | 编译期间隔离 |
api | compile | 编译和运行期间都可见 | jar aar | 无隔离 |
compileOnly | provided | 只参与编译,不打包到 apk | jar | 无隔离 |
runtimeOnly | apk | 编译期间不可见,参与打包到 apk,运行期间可见 | jar aar | 编译期间隔离 |
2、举例说明代码隔离效果
Android3.0以上,例如在 BaseLibrary 中添加了
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
}
我们可以在 BaseLibrary 中正常使用 v7 的功能。这时我们的 UserCenter 中添加了 BaseLibrary 依赖。
dependencies {
implementation project(':BaseLibrary')
}
按照依赖关应该可以在 UserCenter 中正常的使用 V7 功能,但是实际测试中我们并不能找到 V7 中的相关方法,也就是不能正常使用,原因上面的表格写的很清楚implementation
在编译期间就对代码进行了隔离,也就是说他只是 BaseLibrary 的一个内部类,并不对外公开,所以 UserCenter 中找不到方法也就是正常的了。
怎样才能在 UserCenter 中正常 使用 BaseLibrary 中的方法呢,只要找一个无代码隔离发方法就可了,api
刚好符合要求,只要进行如下修改就可以正常使用了。
dependencies {
api 'com.android.support:appcompat-v7:28.0.0'
}
api 是无隔离代码方法,现在可以去 UserCenter 中正常的使用 V7 功能了。
3、implementation 和 api 优缺点
implementation:
- 代码隔离,不对外暴露接口,更安全
- 当前 Library 中配置使用提高代码可读性
- 修改之后只编译当前项目,提高编译速度
api
- 无代码隔离,对其他 Library 可见
- 修改之后其他所有依赖这个 Library 的都需要一起重新编译
implementation
这么多的好处,以后全部使用implementation
就可以了,肯定不能这样,比如在组件化开发中如果我们写了一个公共方法想提供给外部 Library 使用,这个时候implementation
就不能满足需求了,一定要使用api
。所以大家还是需要根据自己的需要进行合理的选择。
(完)