【問題解決】AndroidJDK版本不匹配導(dǎo)致崩潰踩坑記錄-創(chuàng)新互聯(lián)

【問題解決】Android JDK版本不匹配導(dǎo)致崩潰踩坑記錄
      • 部分機(jī)型反饋崩潰問題
      • 谷歌回復(fù)與解決方案
      • Android打包脫糖操作
      • 對比與排查
      • 總結(jié)

前幾天同事遇到一個非常詭異的報錯,緊急處理后,趁著周末仔細(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)時的解決方案有幾種:

  1. 將工程和模塊的JavaVersion設(shè)置為 Java7語言
  2. defalutConfig 里配置 jackOptions{ enable = true}
  3. 升級至Java8,可能遇到亂七八糟的問題可以通過一起升級gradle版本解決

但是想想也不對,因?yàn)槲沂亲鳛镾DK的提供方,提供的應(yīng)該也是JDK7的字節(jié)碼,反編譯后查看字節(jié)碼也確實(shí)是JDK7的,雖然查看字節(jié)碼確實(shí)有KeySetView,但是提供給JD8的工程用應(yīng)該也不至于崩潰吧
在這里插入圖片描述

谷歌回復(fù)與解決方案
  1. 首先當(dāng)然要盡快解決客戶反饋的問題,因?yàn)楹芸炷軌蚨ㄎ坏絾栴},直接換種方式進(jìn)行遍歷/獲取就可以了,接下來研究下為啥會出現(xiàn)這種情況
  2. 部分系統(tǒng)上是沒有問題的,說明這個跟系統(tǒng)版本以及環(huán)境有關(guān),如果是較老的系統(tǒng)缺少相關(guān)的API確實(shí)會導(dǎo)致崩潰
  3. 查詢資料發(fā)現(xiàn):谷歌回復(fù)已解決
Android打包脫糖操作

回想起APK的打包流程,最后打包成dex文件的時候好像是沒看到有JDK版本的區(qū)別,并且JDK8的工程也是可以兼容老的機(jī)器的,這就想到了打包時的一個脫糖操作(對lambda表達(dá)式的處理也是如此),回顧一下相關(guān)的知識點(diǎn):

  • android打包的脫糖處理

在這里插入圖片描述

  • JDK8語法支持表

在這里插入圖片描述

  • DX、D8、R8
  • 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é)
  • 如果是java7的工程,需要引入java8的SDK,除了升級本地的工程的話,其實(shí)也可以去手動去修改別人的SDK(不建議)
  • 如果是發(fā)現(xiàn)提供出去的SDK存在包含JDK8的字節(jié)碼的話,可以檢查一下當(dāng)前的編譯環(huán)境是否使用了OpenJDK或者是否是android工程

最后最后,如果覺得有幫助歡迎點(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)

網(wǎng)站優(yōu)化排名