implementation,compile,api,Unable to resolve dependency ':app@debugAndroidTest/compileClasspath'

首先上面的错误是因为lib依赖了本地lib,然后发布到远程maven库,使用时就会报上面的错误。
gradle3.+版本后,gradle的依赖方法发生了改变,推荐使用implementation,compile已经不被推荐,api代替compile,作用和compile相同。androidTestCompile被 androidTestImplementation替换,testCompile被 testImplementation 替换,本篇主要讲解implementation和api。
在这里插入图片描述
简单总结上面的意思就是推荐使用implementation,可以缩短编译的时间。api和compile作用相同,所有使用compile的地方都可以用api替换。Implementation 的依赖没有传递性,compile的依赖具有传递性。
使用implementation编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,也就是将该依赖隐藏在内部,而不对外部公开,也就是使用implementation指令的依赖不会传递。

implementation节省编译时间的原理(module A implementation module B),由于只在本moduleA中有用,所以如果修改了引用的module B,其他引用module A的项目不需要重新编译。

1 都是依赖本地module
使用api进行依赖:
如果APP本地依赖 module A ,module A本地依赖api module B ,则app可以使用B中元素。(APP 如果再依赖 module B 不会报错)

使用implementation:
如果APP本地依赖module A ,module A 本地依赖implementation module B ,则app无法使用B中元素。(如果此时APP 又本地依赖了module B,APP中可以使用B 中元素,且不会报module B的版本冲突)

2 都是远程依赖
使用api进行依赖:
如果APP远程依赖 module A ,module A远程依赖api module B ,则app可以使用B中元素。
使用implementation:
如果APP远程依赖module A ,module A 远程依赖 implementation module B ,则app可以使用B中元素。

3 一个远程依赖 ,一个本地依赖
使用api进行依赖:
如果APP本地依赖 module A ,module A远程依赖api module B ,则app可以使用B中元素(类似glide)。(APP 再添加对module B的远程依赖,编译不会有问题。)

使用implementation:
如果APP本地依赖 module A ,module A远程依赖implementation module B ,则app无法使用B中元素(类似glide)。(app中添加module B的远程引用,APP就可以使用module B中元素)

4 其他情况
如果APP远程依赖 module A ,module A本地依赖 module B,编译会出错 ,如果app添加对module B的本地依赖,依然会存在问题。

如果APP远程依赖 module A,module B ,module A 远程依赖(api) module B,如果版本都相同,不会有问题。

app 依赖本地module A ,moduleB,而module A 又远程依赖(api 或者implementation )module B,此时会报错误,由于重复引用问题。需要把本地引用的module B 从远程引用的module A中移除。

   implementation ("com.xxx.a:moduleA:1.0.0"){
            exclude group: "com.xxx.b", module:"moduleB"
        }

添加的依赖版本不同时:
上面的每种情况都是建立在module 版本相同的情况下,如果版本不同会出现各种各样的问题,当发生问题时,特别是包冲突问题,需要从module中exclude掉特定的包。

如果项目报V4 冲突,通常有两种方案,本地包移除版本不同的v4(一般从v7中移除),第二种方案是从第三方包中exclude掉v4包。

在这里插入图片描述
发生上面的错误是由于,lib,引用了本地库(本地module),换成引用网络库就好了。

全部远程依赖模式下,无论是api还是implemention都起不到依赖隔离的作用。

如果一个module引用了jar文件,打包时不想把jar打入aar中,可以使用compileOnly,jar就不会存在aar中,使用时添加jar包就可以了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值