深入理解编译注解(三)依赖关系 apt/annotationProcessor与Provided的区别

前言

网上有很多朋友在问: apt/annotationProcessor与Provided 都是只编译并不打入apk中,他俩到底有什么区别呢?所以我就把自己所了解的与大家分享一下。

正文

编译关系 apt/annotationProcessor

只在编译的时候执行依赖的库,但是库最终不打包到apk中,从之前的demo来看,总结一下:

编译库中的代码没有直接使用的意义,也没有提供开放的api调用,最终的目的是得到编译库中生成的文件,供我们调用。

例如demo中,app与io-compiler是编译关系,app在运行时需要io-compiler编译生成的MainActivity$$ViewInject文件,跟io-compiler无关。

让我们来做一个比喻:

演员表

小明:扮演app。
自动售卖机:扮演编译库。
营养快线:编译库生成的文件。

剧情:
小明站在自动售卖机前,对它说:感觉身体被掏空,赶紧给我来瓶营养快线!然后售卖机忽忽悠悠弹出一瓶营养快线,然后小明就走了。

简单的说,就是利用编译库达成目的,目的达成就把它抛弃了,我们要的仅仅是编译库的成果。差不多就是这个意思,概念到位即可。

Provided

Provided 虽然也是编译时执行,最终不会打包到apk中,但是跟apt/annotationProcessor有着根本的不同。

一般应用场景是这样的:

A 、B、C都是Library。
A依赖了C,B也依赖了C
App需要同时使用A和B
那么其中A(或者B)可以修改与C的依赖关系为Provided

A这个Library实际上还是要用到C的,只不过它知道B那里也有一个C,自己再带一个就显得多余了,等app开始运行的时候,A就可以通过B得到C,也就是两人公用这个C。所以自己就在和B汇合之前,假设自己有C。如果运行的时候没有C,肯定就要崩溃了。

再来做一个比喻:

演员表
小明:扮演app
小刚:扮演Library(A)
小毛:扮演Library(B)

剧情:
春天到了小明寂寞难耐,给小刚和小毛打电话:今晚夜色撩人,我们去大保健吧,带上你们的会员卡,我请客!
小刚:我有XXX的会员卡,会员通用,而且不是会员不让进,十分安全,我和小毛带一张就足够了。
小毛:没问题!你带会员卡吧,我开车去接你俩。

结局1
小刚没有忘记带会员卡,一切顺利。

结局2
小刚忘记带会员卡,3个人因计划泡汤扫兴而归。

差不多就是这个意思,比喻如果有小问题不要在意,关键是意会,你懂得。

总结一下,Provided是间接的得到了依赖的Library,运行的时候必须要保证这个Library的存在,否则就会崩溃,起到了避免依赖重复资源的作用。

总结

到这里就结束了,不知道大家有没有对他们的区别有了更深的体会,如果有什么问题就留言,我们再好好的讨论。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值