背景
客戶需要接入我們的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。
最終選擇了第三個方案。