前幾天同事遇到一個非常詭異的報錯,緊急處理后,趁著周末仔細(xì)研究了一下原因,覺得還挺有意思的,所以記錄一下
成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站建設(shè)、成都做網(wǎng)站網(wǎng)站策劃,項目實(shí)施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元陸豐做網(wǎng)站,已為上家服務(wù),為陸豐各地企業(yè)和個人服務(wù),聯(lián)系電話:028-86922220部分機(jī)型反饋崩潰問題問題背景:在一個SDK工程,前幾天客戶那邊報了一個崩潰問題,并且在API 28以上的系統(tǒng)才會:No virtual method keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView
查看調(diào)用棧后發(fā)現(xiàn)調(diào)用到了ConcurrentHashMap#keySet
,順著調(diào)用發(fā)現(xiàn)這是一個JDK1.8的API
這么看起來應(yīng)該是JDK7 和JDK8的一個兼容問題,具體的問題需要繼續(xù)往下看
第一反應(yīng)是是不是因?yàn)楫?dāng)前工程是JDK7的工程導(dǎo)致的?因?yàn)橹耙苍贘DK7的工程上集成過JDK8的三方庫,因?yàn)樽止?jié)碼不匹配導(dǎo)致崩潰,當(dāng)時的解決方案有幾種:
- 將工程和模塊的JavaVersion設(shè)置為 Java7語言
- defalutConfig 里配置 jackOptions{ enable = true}
- 升級至Java8,可能遇到亂七八糟的問題可以通過一起升級gradle版本解決
但是想想也不對,因?yàn)槲沂亲鳛镾DK的提供方,提供的應(yīng)該也是JDK7的字節(jié)碼,反編譯后查看字節(jié)碼也確實(shí)是JDK7的,雖然查看字節(jié)碼確實(shí)有KeySetView,但是提供給JD8的工程用應(yīng)該也不至于崩潰吧
回想起APK的打包流程,最后打包成dex文件的時候好像是沒看到有JDK版本的區(qū)別,并且JDK8的工程也是可以兼容老的機(jī)器的,這就想到了打包時的一個脫糖操作(對lambda表達(dá)式的處理也是如此),回顧一下相關(guān)的知識點(diǎn):
對比與排查
- DX:class文件轉(zhuǎn)化為dex
- D8:脫糖、class文件轉(zhuǎn)換為dex
- R8:整合了Proguard和D8 ,減少了一個編譯步驟,同時保留了字節(jié)碼優(yōu)化能力
了解到上面的知識,隨即仔細(xì)的看了下出SDK的分支,結(jié)果發(fā)現(xiàn)…
這居然是還是個java工程?。?!那自然沒有脫糖相關(guān)的操作了,再看下輸出的jar
升級成android library 工程后打包的aar,輸出產(chǎn)物正常!撒花
總結(jié)最后最后,如果覺得有幫助歡迎點(diǎn)個👍或關(guān)注~
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
本文名稱:【問題解決】AndroidJDK版本不匹配導(dǎo)致崩潰踩坑記錄-創(chuàng)新互聯(lián)
分享鏈接:http://muchs.cn/article40/cdciho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、商城網(wǎng)站、移動網(wǎng)站建設(shè)、定制開發(fā)、網(wǎng)站營銷、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)