Android 但三方库子依赖与 app 依赖冲突

2020-03-24 11:28:48 +08:00
 Gehrman

项目引入了 okhttp3 4.0 第三方库用的是 okhttp3 3.x

运行时报错:

java.lang.NoSuchMethodError: No static method create(Lokhttp3/internal/io/FileSystem;Ljava/io/File;IIJ)Lokhttp3/internal/cache/DiskLruCache; in class Lokhttp3/internal/cache/DiskLruCache; or its super classes (declaration of 'okhttp3.internal.cache.DiskLruCache' appears in /data/app/com.aliyun.iot.demo-o1CF4XvCIWdp1hjYbjioGA==/base.apk!classes3.dex)

请问有办法指定第三方子依赖的版本吗?或者禁止高版本替换第三方库子依赖的低版本

简而言之就是能不能我项目继续用 4.0,第三方库子依赖的版本不被替换

11217 次点击
所在节点    Android
12 条回复
ReasonLee
2020-03-24 11:40:16 +08:00
exclude
nicevar
2020-03-24 11:41:29 +08:00
exclude 指定的 group 或者包
wvitas
2020-03-24 11:41:31 +08:00
楼上正解
Gehrman
2020-03-24 12:07:56 +08:00
是在第三方库下面 加 exclude okhttp 吗?
我之前在自己项目的 okhttp 下 exclude 了第三方库,没有用。
是我的方法错了?
JsonLee
2020-03-24 13:32:31 +08:00
引入第三方类库的时候 exclude 掉 okhttp,不过慎重使用就是了,除非你能保证第三方类库所使用的 okhttp 的 API 在 4.*的版本上也有且行为一致,不然就会埋下祸根。
Gehrman
2020-03-24 13:38:32 +08:00
@JsonLee 目前就是因为不一致,所以想知道有没有办法让第三方库使用自己指定的版本 3.x,自己的项目仍然用 4.0 。
wuketidai
2020-03-24 13:46:36 +08:00
用 jarjar 把 第三方依赖重打包下
nicevar
2020-03-24 13:53:39 +08:00
@Gehrman 你用 exclude 之后,第三方库也就是使用你的 4.0 库,但是不能保证不出问题,如果 3.x 到 4 的 api 有不兼容的情况就可能无法正常工作了,所以你要自己看一下 okhttp 的 releasenote 才知道,我记得 okhttp 3.13.1 之后需要 android 5+才行,也就是 4.x 系统的不支持了,如果你执意要使用 okhttp 4.0,又出现不兼容的第三方库,那只能去找第三方库的源码自己修改,或者提个 issue 等着
Gehrman
2020-03-24 14:05:25 +08:00
@nicevar 现在是有兼容问题,搞了一上午好像没什么好解,@wuketidai 的方法好像有点可行性,但是得跟着第三方库升级重新打包,还是降回去算了
DeweyReed
2020-03-24 14:07:19 +08:00
错误信息是第三方库用了 okhttp3 的内部的一个类(okhttp3/internal/cache/DiskLruCache),exclude 后第三方库(像是阿里的?)代码不会变的呀,exclude 应该没用。
有第三方库的代码的话,自己去把引用了 internal 的类改一下(把 okhttp3.internal.cache.DiskLruCache 换成 Jake Wharton 老大的那一个单独库试试,或者直接复制代码),然后自己打包 AAR 。

乱用 internal 下的类在国产 SDK 里挺常见的,没办法(摊手
HangoX
2020-03-24 14:17:53 +08:00
exclude 没用,因为你这个第三方使用的包用了一个 ok3.x 版本的才有的方法,去掉了就会报错。如果你强硬使用 4.0 的话,只能把这个第三方的包用的 ok 方法补回来,方法有自己编一个,或者建立一个一样包名的类,实现这个方法
Gehrman
2020-03-24 15:12:52 +08:00
@DeweyReed
这个确实是阿里的 sdk,头疼,自己打包 aar 以后每次更新都得打包,还是降回去好了

@HangoX
试了下这个方法,建了个一样的包,把对应的文件 copy 进去,之前的错没了。然后 4.0 又报错了,应该是同名的文件覆盖了,ok4.0 以后是 kotlin 构建的,companion object 在复制的 java 文件里是没有的

谢谢大家给的建议,我还是降回去好了 orz

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/655632

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX