Android中啟用Java 8

akiyama發表於2017-07-22

支援 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上使用基本廢了,和玩具沒什麼區別,建議不要輕易啟用。

相關文章