原文链接:
https://jeroenmols.com/blog/2017/06/14/androidstudio3/

https://blog.csdn.net/lonewolf521125/article/details/78482880


更新到 Android Studio 3.0 之后,构建多 module 结构的项目速度有很大的提升,但不幸的是这同样意为着 Gradle 插件的 API 也做了修改.

本文将详细的介绍本次改变的优点,以及使你能够顺畅应用升级。

目前的问题

为了理解 Gradle plugin 2.0 编译系统的限制,现在考虑下面这个拥有多层引用 module 的工程:

现在请考虑一下最下面的 module A,对 module A 一般来讲会有两种变化:

  1. Implementation change(内部实现的更改):
    内部更改,未涉及到对外的接口变更
  2. ABI change(Application binary interface change;对外接口的更改):
    module A 对外的接口做了修改

注意:下文中,所有重编译的 module 都会用红色高亮显示。

Implementation change

既然 module A 的对外接口未做更改,那么 Gradle 自然也只对 module A 做重编译。所有 module A 的消费者(实际就是直接或间接引用到 module A 的其他 module)都不会受到影响。

在此场景下没有什么问题。

ABI change

当 module A 的对外接口做更改的时候,module A 的直接消费者 B1、B2、B3(也就是直接引用到 module A 的其他 module)也需要重编译。

但是 A 的直接消费者们(B1、B2、B3)有可能通过自己( B1、B2、B3 )的接口将 A 暴露出去!所以为了保险起见,这些引用到 B1、B2、B3 的 module (C1、C2、C3) 也需要从编译。同样的引用到 C1、C2、C3 也一样需要重新编译…

因此 Gradle 实际上需要对所有的 module 进行重编译。

现在我们遇到了一个大问题:

一个代码的更改引发了所有 module 的重编译。
本问题最根本的原因是 Gradle 并不知道你是否通过一个 module 将其引用到的另一个 module 接口给泄露出去了(例如 Gradle 并不知道你是否在 module B1 中将 A module 的接口暴露给了 App)。

救星来了(Android Gradle plugin 3.0)

现在最新一版的 Android Gradle 插件需要你明确的指出你是否要将某 module 的接口暴露出去。基于此它可以在判断某 module 是否需要重编译时做出正确的选择。

compile 已被弃用,并由两个新的替代:

  • api:通过你自己的接口将你引用到的 module 接口暴露出去供其他 module 使用,含义上实际与 compile 一致

    比如:对于 B1 module ,如果其引用 A module 时使用了 api ,那么 C1 就可以使用到 A module 的接口

  • implementation:仅仅将你引用到的此 module 在内部使用,而不将其接口暴露给外部

    比如:对于 B1 module,如果其引用 A module 时使用了 implementation,那么 C1 无法使用到 A module 的接口


基于以上,现在你就可以明确的告诉 Gradle 某个 module 在它引用的 module 更改时进行重编译,在它引用的 module 未更改时不做重编译。

示例如下:

dependencies {//当 legofy 对外接口更新时,重编译本 module 以及所有引用此 module 的 moduleapi project(':legofy')//当 landscapevideocamera 对外接口更新时,仅仅重编译本 module implementation project(':landscapevideocamera:1.0.0') }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

迁移指南

(废弃 compile 改用 api 和 implementation 形式的操作指南)

理论上你可以将所有的 compile 都修改为 api(运行上不会报任何错误),但是这种方式还是可能会因为一个代码的变动引发所有 module 的重编译:

所以最好的方式是尽量使用 implementation 替换 compile ,当且仅当想将你引用的 module 暴露出去的时候再用 api,按照这种方式会减少很多重编译。

希望这篇文章能尽量阐明 api 与 implementation 之间模糊的含义
(至于官方的迁移文档,呵呵哒)

其他的依赖配置

团队也利用这次变更最终给予其他配置以适当的名称:

  • provided 配置现在改成了 compileOnly
  • apk 配置现在改成了 runtimeOnly

就像之前一样,你可以将配置与 variants 进行组合:debugApi、testImplementation 等

#其他的迁移项目
~~Android Studio 3.0 包含了许多终于得到解决的其他改进,我最喜爱的是:~~
* 所有的 google dependencies 在 Maven 在线仓库中都可以被访问到
~~。。。~~

详细信息:
https://developer.android.com/studio/preview/features/new-android-plugin-migration.html

总结:

为了提升多项目结构的构建速度, Android Gradle plugin 需要一个突破性的提升。尽量使用 implementation (因为它会引发更少的 module 重编译)

--------------------- 本文来自 杨筱毅 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lonewolf521125/article/details/78482880?utm_source=copy

转载于:https://www.cnblogs.com/0616--ataozhijia/p/9753948.html

[Android] Implementation vs API dependency相关推荐

  1. Android gradle implementation与api的区别及引用传递

    在本篇文章我会先描述使用的场景及结果,然后再做总结,而不是一开始就给出结论,这样大家也比较好理解,也可以自己创建项目运行验证下. 场景一 项目中有三个module,分别叫app.lib1.lib2,依 ...

  2. Android Studio3.xx新的依赖方式 implementation、api、compileOnly详解

    转载: https://blog.csdn.net/yuzhiqiang_1993/article/details/78366985 2017 年google 后,Android studio版本更新 ...

  3. ERROR: Unable to find method 'com.android.build.gradle.api.BaseVariant.getOutputs()Ljava/util/List;'

    这个问题一般是由老项目升级出现的问题,比如老项目的gradle4.0以下的升级到gradle4.6,或者更高5.3.2等,这个升级的过程中,就会出现很多问题,比如下面这个: ERROR: Unable ...

  4. Android中所有API和对应权限的数据结构构建

    #写在前面的话 这是一篇有毒博客,我觉得,读者慎入. 我想说,那个最底下的广告怎么去,辣眼睛- T -T 当然,你也可以帮我点下我的,在这里跪谢大家 https://www.captainbed.ne ...

  5. Android 操作串口 (android serial port api)

    Android 操作串口 (android serial port api)

  6. Android 2.3 API改变大全(转载)

    遇到OOM问题,需要使用VMRuntime类的时候才发现,原来2.3被移除了,想知道它是否有替代类?留下脚印,再继续... Android 2.3 API改变大全 作者: Android开发网原创 时 ...

  7. android版本sdk api对应,Android API Level与sdk版本对照表

    API等级1: Android 1.0 API等级2: Android 1.1 Petit Four 花式小蛋糕 API等级3: Android 1.5 Cupcake 纸杯蛋糕 API等级4: An ...

  8. android call require api level

    android  call require api level 5 等错误,需要在project -> android tools-> clear lint markers 来清楚 转载于 ...

  9. 我的Android进阶之旅------Android中高低API版本兼容使用@TargetApi或者@SuppressLint(NewApi)...

    Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi") 例如:AndroidManifest.xml中,我们配置了sdk版本的 ...

最新文章

  1. 一个通俗易懂的HMM例子
  2. eos操作系统_EOS基础全家桶(十一)智能合约IDE-EOS_Studio
  3. 《毅力–如何培养自律的习惯》读书笔记
  4. [react] 如何给非控组件设置默认的值?
  5. kube-scheduler 磁盘调度源码分析
  6. C语言细节之四: 空指针
  7. HDU3507 Print Article(斜率优化dp)
  8. 走进R语言的世界——简单数据处理
  9. list遍历_Python遍历list,使用range和enumerate的效率区别
  10. Linux局域网传输文件
  11. 论文(四):DTFD-MIL: Double-Tier Feature Distillation Multiple Instance Learning for Histopathology Whole
  12. 全球及中国ISO刀柄行业产销需求及消费策略调研报告2022版
  13. oracle 判断标签,判断text标签
  14. 开源利器分享:BitBar 坐看今天你的项目涨了多少star
  15. SSL证书配置(https访问接口, 单向认证和双向认证)
  16. Geometry-guided Kernel Transformer ——GKT代码复现
  17. c语言程序由什么开头和结尾,一个完整的C程序由什么组成?
  18. android 背景 投影,智能投影新篇章,android与投影完美结合-神画Y1
  19. 自主开发的OFD编辑器简介 -- 开ofd可编辑之先河
  20. uniapp 微信小程序发布版本提示珊瑚运营平台、uniAD 有新版本怎么解决?

热门文章

  1. 【Android先进】查看手机记忆库状态和应用方法
  2. Vs2013 头文件注释
  3. 关于Android Fragment基础点(转)
  4. fgetc(),getc(),getchar()的用法
  5. make的一些默认操作
  6. 拼团功能,开团并发问题,使用数据库行锁方案
  7. Centos 安装新python
  8. sqlite3数据库教程
  9. 【Java NIO】一文了解NIO
  10. 当我们在谈论技术时,技术的本质和价值究竟是什么?