原文參考鏈接:
https://www.2cto.com/kf/201710/691546.html
使用Java8語言功能
前言:
android支持全部Java7語言功能香缺,支持部分的Java8語言功能(默認(rèn)和靜態(tài)接口方法手销,Lambda表達(dá)式,重復(fù)注解图张,方法引用锋拖,類型注解)。
注意點:
Android開發(fā)運用時候祸轮,將項目的源和目標(biāo)兼容值保留為Java7,但可以使用JDK8進(jìn)行編譯兽埃。
需使用Jack工具鏈來支持Java8語言功能,但是開發(fā)工具AndroidStudio2.1及其以上才支持Jack工具鏈适袜。
配置使用Java8和Jack:
在項目中build.gradle中配置Java8和Jack的啟用:
android {
...
defaultConfig {
...
jackOptions {
enabled
true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
注意點:
Instant Run不能用于Jack , 依賴中間類文件的工具(例如柄错,Lint,Jacoco)不能用于Jack。
開發(fā)中遇到com.android.jack.ir.JNodeInternalError異常
在使用Jack來開啟Java8語法中苦酱,依賴了Glide v4庫售貌,造成沖突:
Error:Execution failed
for
task
':app:transformJackWithJackForDebug'
.
com.android.jack.ir.JNodeInternalError:
java.lang.Exception: java.lang.AssertionError: No yet implemented
官方最新通告:
Jack toolchain is 已經(jīng)棄用。若是原本項目中使用了Jack疫萤,可以繼續(xù)使用颂跨。但是,在AndroidStudio3.0中可能會移除Jack的依賴扯饶。因此恒削,建議禁用Jack,使用AndroidStudio的默認(rèn)toolchain,它支持Java8帝际。
解決方式:
第一種:使用androidStudio3.0版本
第二種:使用retrolambda庫(非官方)
Retrolambda庫的使用
介紹:
一個Gradle 插件蔓同,用于在Java 6,7 和Android上支持Java Lambda饶辙。
使用步驟:
1.在項目的build.gradle中添加依賴:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath
'com.android.tools.build:gradle:2.3.2'
//gradle-retrolambda配置
classpath
'me.tatarka:gradle-retrolambda:3.7.0'
}
}
2. 在Module的build.gradle中添加部分代碼
apply plugin:'com.android.application'
//gradle-retrolambda配置
apply plugin:'me.tatarka.retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
3. 添加混淆規(guī)則
在proguard-rules.pro文件中蹲诀,添加以下規(guī)則:
Gradle Retrolambda混淆規(guī)則
-dontwarn java.lang.invoke.*
-dontwarn *$$Lambda$