支援 Java 8 語言功能需要一個名為 Jack 的新編譯。Jack 僅在 Android Studio 2.1 和更高版本上才受支援。因此,如果要使用 Java 8 語言功能,則需使用 Android Studio 2.1 開發應用。
Java8功能
targetSdkVersion>=23以下功能特性
- 預設和靜態介面方法
- Lambda 表示式(在 API 級別 23 及更低版本中也可用)
- 重複註解
- 方法引用(在 API 級別 23 及更低版本中也可用)
- 型別註解(在 API 級別 23 及更低版本中也可用)
Java 8 語言 API
- java.lang.FunctionalInterface
- java.lang.annotation.Repeatable
- java.lang.reflect.Method.isDefault()
以及與重複註解關聯的反映 API,例如 AnnotatedElement.getAnnotationsByType(Class)
- java.util.function
- java.util.stream
Jack 工具鏈
要使用新的 Java 8 語言功能,還需使用新的 Jack 工具鏈。
新的 Android 工具鏈將 Java 源語言編譯成 Android 可讀取的 Dalvik 可執行檔案位元組碼,且有其自己的 .jack 庫格式,在一個工具中提供了大多數工具鏈功能:重新打包、壓縮、模糊化以及 Dalvik 可執行檔案分包。
以下是構建 Android Dalvik 可執行檔案可用的兩種工具鏈的對比:
- 舊版 javac 工具鏈:
Javac (.java → .class) → dx (.class → .dex)複製程式碼
- 新版 Jack 工具鏈:
Jack (.java → .jack → .dex)
啟用 Java 8
要為您的專案啟用 Java 8 語言功能和 Jack,請在模組級別的build.gradle 檔案中輸入以下內容:
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}複製程式碼
已知問題
Instant Run 目前不能用於 Jack,在使用新的工具鏈時將被停用。
由於 Jack 在編譯應用時不生成中間類檔案,依賴這些檔案的工具目前不能用於 Jack。下面是一些工具示例:
- 對類檔案進行操作的 Lint 檢測工具
- 需要應用類檔案的工具和庫(例如使用 JaCoCo 進行儀器測試中)
總結
java8有許多非常好的特性,特別在Android開發中配合RxJava使用Lambda 表示式非常方便,但是就目前的啟用方式來說感覺問題比較多,特別是Jack工具鏈的使用,沒有生成中間.class檔案,許多需要依賴於.class的工具都不能使用,例如JaCoCo和Mockito的工具,甚至最常用的lint和ProGuard都不能使用。如果沒有後續改良版本,我感覺這個java8在android上使用基本廢了,和玩具沒什麼區別,建議不要輕易啟用。