V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Gehrman
V2EX  ›  Android

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

  •  
  •   Gehrman · 2020-03-24 11:28:48 +08:00 · 11205 次点击
    这是一个创建于 1739 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目引入了 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,第三方库子依赖的版本不被替换

    12 条回复    2020-03-24 15:12:52 +08:00
    ReasonLee
        1
    ReasonLee  
       2020-03-24 11:40:16 +08:00
    exclude
    nicevar
        2
    nicevar  
       2020-03-24 11:41:29 +08:00
    exclude 指定的 group 或者包
    wvitas
        3
    wvitas  
       2020-03-24 11:41:31 +08:00
    楼上正解
    Gehrman
        4
    Gehrman  
    OP
       2020-03-24 12:07:56 +08:00
    是在第三方库下面 加 exclude okhttp 吗?
    我之前在自己项目的 okhttp 下 exclude 了第三方库,没有用。
    是我的方法错了?
    JsonLee
        5
    JsonLee  
       2020-03-24 13:32:31 +08:00 via iPhone
    引入第三方类库的时候 exclude 掉 okhttp,不过慎重使用就是了,除非你能保证第三方类库所使用的 okhttp 的 API 在 4.*的版本上也有且行为一致,不然就会埋下祸根。
    Gehrman
        6
    Gehrman  
    OP
       2020-03-24 13:38:32 +08:00
    @JsonLee 目前就是因为不一致,所以想知道有没有办法让第三方库使用自己指定的版本 3.x,自己的项目仍然用 4.0 。
    wuketidai
        7
    wuketidai  
       2020-03-24 13:46:36 +08:00
    用 jarjar 把 第三方依赖重打包下
    nicevar
        8
    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
        9
    Gehrman  
    OP
       2020-03-24 14:05:25 +08:00
    @nicevar 现在是有兼容问题,搞了一上午好像没什么好解,@wuketidai 的方法好像有点可行性,但是得跟着第三方库升级重新打包,还是降回去算了
    DeweyReed
        10
    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
        11
    HangoX  
       2020-03-24 14:17:53 +08:00
    exclude 没用,因为你这个第三方使用的包用了一个 ok3.x 版本的才有的方法,去掉了就会报错。如果你强硬使用 4.0 的话,只能把这个第三方的包用的 ok 方法补回来,方法有自己编一个,或者建立一个一样包名的类,实现这个方法
    Gehrman
        12
    Gehrman  
    OP
       2020-03-24 15:12:52 +08:00
    @DeweyReed
    这个确实是阿里的 sdk,头疼,自己打包 aar 以后每次更新都得打包,还是降回去好了

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

    谢谢大家给的建议,我还是降回去好了 orz
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2708 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 12:36 · PVG 20:36 · LAX 04:36 · JFK 07:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.