Retrofit 2.8.0在android 7.0中的bug Failed resolution of: Ljava/lang/invoke/MethodHandles$Lookup

今天早晨发生了一件极其诡异的事,各位看官听我娓娓道来。

嗯~~~~咳咳,口罩戴好了再来看哈,疫情太严重,害怕;

早晨来了,一如既往的开电脑,开死丢丢,git pull,连接手机,install run,一切看似正常无比,实则危机四伏;

故事发生在我点击含有网络请求的页面,Duang的一下子,崩了。。。一口还没下咽的枸杞菊花茶差点喷出来,第一反应就是口吐芬芳同事又提错代码了,连忙打开logcat看了一下错误日志,日志如下

日志显示错误发生在底层网络框架,what the f**k ???  还有人敢改底层???并且不经过测试就提交???这是要掉脑袋的啊!!!

于是我又咬了口达某园法式小面包,继续看错误发生在哪,内心里已经构思好了一份10000字的文章用来喷我的口吐芬芳同事。

嗯嗯~扯远了,现在分析一下日志,首先看到的肯定是自己的代码(这不用多说),可以看到图二里还有两行极为关键的caused by:

Caused by: java.lang.ClassNotFoundException: Didn't find class "java.lang.invoke.MethodHandles$Lookup" on path: DexPathList[[zip file "/data/app/com.kuke.kkpianoroom-1/base.apk"],nativeLibraryDirectories=[/data/app/com.kuke.kkpianoroom-1/lib/arm64, /data/app/com.kuke.kkpianoroom-1/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:380)

下面我们来逐一分析问题:

首先肯定是自己的代码啦,毕竟还指着这个喷队友呢,10000字文章不能白构思不是。

mBuilder = new Retrofit.Builder().client(client)
        .addConverterFactory(GsonConverterFactory.create())
        .addCallAdapterFactory(RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()));

错误发生在new Retrofit.Builder()这一步,这里是在调用retrofit的方法

在这里就看到了Platform对象的获取,我们继续往下看,看看这个Platform.get()究竟在搞什么飞机。。

自称福尔摩斯崔少的我终于在跟踪了几步之后发现了问题的出现位置,等等,这个Lookup似曾相识,再看一下错误日志,这个类在第二个报错图上有出现,显示没有找到MethodHandles中的Lookup类,难怪这里会报错,你都找不到人家凭什么让人家干活,兴许人家在疫情区隔离呢,但是话又说回来了,这东西你都找不到,那我能怎么办。。。算了,还是找caused by去研究研究吧;

乍一看caused by信息,也是一脸懵逼,这不就是找不到类,没法利用反射调用native方法么,还是同样的问题,ok,既然话已至此,放大招直接google和百度;

找了一圈回来发现要么说是lambda表达式的,要不就是让clean,要不就是让把.gradle .idea文件夹删除重试,要不就是将设置里的instance run前的√去掉的(哦对在这提一嘴,在死丢丢3.4还是3.5以后instance run已经被去掉了,改为HotSwap了),反正我是试了一通也没得到解决,无奈。

百感交集之中想到了去Github上看看有没有相关的issue,于是乎试着抱一抱的心态去了git,这一看可不要紧,,,

看着了没,closed的头一个issue,同样的问题,赶紧进去一探究竟。

看到这一行后我这心里热了起来,躁动了,这兄弟也是发生在7.0手机上,和我如此的相似,此情此景,我不自觉的哼起小曲“捂住脑门儿晃动你的胯骨轴,好像有事在发愁,哒哒哒哒,我想要带你回家“,继续看继续看,

后边还有几个人也是问了同样的问题,大致回复应该是只有retrofit 2.8.0上会有这个问题,最后老板出来回复了

敢情这个版本在api24 25上不能用啊。。。

再看我的gradle,果然,依赖的是latest.release版本,一直是最新的,难怪我会出问题。于是乎赶紧把版本写死成2.7.1,再调试,ok成功,perfect,问题解决。

由于事发突然,这里我要静下心来总结一下此次诡异事件:

首先发现问题不要慌,一定要先找自己的问题,能跟源码就跟,分析代码中可能出现问题的地方,实在不行直接debug,跟到看不懂或者解决不了再进行网络求助,之前我坚信自己遇到的问题一定会有大佬已经遇到并解决了,然鹅这次真的不是了,搜索出的文章没找到能解决问题的,如果用到的是第三方的东西,要善于去issue或者工单进行询问,要是第三方都解决不了的问题那就得考虑是不是该换种实现方式了。。。又或者。。。。嗯~~~改行去卖烤冷面。。。

还有就是这个latest.release的依赖方式要慎用,不然会不知不觉的碰到问题,个人还是建议写死版本号,定期自己做更新,测试成功后再提交版本,利人利己,做个好孩子。

哦对,忘了件事,得把脑袋中10000字的喷文删喽,不然会占用今天的脑内存。。。。

今天就到这里,希望能对朋友们有所帮助,我要继续喝我得菊花枸杞茶了,“又回到最初的起点,呆呆地站在镜子前~~~啦啦啦啦,啦啦啦啦啦啦~”

这里附上issue地址:

https://github.com/square/retrofit/issues/3343

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值