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 中添加了

  1. dependencies {
  2. implementation 'com.android.support:appcompat-v7:28.0.0'
  3. }

我们可以在 BaseLibrary 中正常使用 v7 的功能。这时我们的 UserCenter 中添加了 BaseLibrary 依赖。

  1. dependencies {
  2. implementation project(':BaseLibrary')
  3. }

按照依赖关应该可以在 UserCenter 中正常的使用 V7 功能,但是实际测试中我们并不能找到 V7 中的相关方法,也就是不能正常使用,原因上面的表格写的很清楚implementation在编译期间就对代码进行了隔离,也就是说他只是 BaseLibrary 的一个内部类,并不对外公开,所以 UserCenter 中找不到方法也就是正常的了。
怎样才能在 UserCenter 中正常 使用 BaseLibrary 中的方法呢,只要找一个无代码隔离发方法就可了,api刚好符合要求,只要进行如下修改就可以正常使用了。

  1. dependencies {
  2. api 'com.android.support:appcompat-v7:28.0.0'
  3. }

api 是无隔离代码方法,现在可以去 UserCenter 中正常的使用 V7 功能了。

3、implementation 和 api 优缺点

implementation:

  • 代码隔离,不对外暴露接口,更安全
  • 当前 Library 中配置使用提高代码可读性
  • 修改之后只编译当前项目,提高编译速度

api

  • 无代码隔离,对其他 Library 可见
  • 修改之后其他所有依赖这个 Library 的都需要一起重新编译

implementation这么多的好处,以后全部使用implementation就可以了,肯定不能这样,比如在组件化开发中如果我们写了一个公共方法想提供给外部 Library 使用,这个时候implementation就不能满足需求了,一定要使用api。所以大家还是需要根据自己的需要进行合理的选择。

(完)