invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)

背景

客戶需要接入我們的SDK(aar包,java 8),客戶本身的工程是java 7,所以客戶需要將工程升級支持java 8。一般來說只需要在app級的build.gradle增加以下配置即可:

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

可是客戶工程龐大,gradle配置復(fù)雜,增加java 8配置后編譯時出現(xiàn)了標(biāo)題上的錯誤。

分析

仔細分析用戶的build.gradle文件,發(fā)現(xiàn)用到了Retrolambda插件。

retrolambdaConfig 'net.orfjackal.retrolambda:retrolambda:2.3.0'

Retrolambda 是一個 Java 類庫,在 Java 5、6、7 上實現(xiàn) Java 8 的 Lambda 表達式的功能。了解到這個是客戶在將工程升級到j(luò)ava 8時額外添加的(后面了解到是為了處理一個跟java 8無關(guān)的編譯錯誤)。

在自己的demo工程上模擬了一遍用戶的編譯環(huán)境,發(fā)現(xiàn)去掉Retrolambda可以編譯通過,保留的話則會報類似標(biāo)題上的編譯錯誤。

后續(xù)

遇到這個問題時,想到過三種處理思路:
1.將我們的sdk降級到j(luò)ava 7(刪除掉代碼里所有java 8的feature),這種方案改動極大,但是可以讓我們的sdk的兼容性變得更好;
2.不改sdk的代碼,修改打包方式,在生成的aar包中抹去所有java 8的feature,使得我們的sdk可以兼容客戶java 7的工程(研究了下沒有發(fā)現(xiàn)方案);
3.協(xié)助/說服客戶將工程升級到j(luò)ava 8。
最終選擇了第三個方案。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容