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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章