Save the date! Android Dev Summit is coming to Sunnyvale, CA on Oct 23-24, 2019.

Java 8 語言功能

Android N 引進對 Java 8 語言功能的支援,供您在開發目標為 Android N 的應用程式時使用。此頁面描述「Android N Preview」中支援的新語言功能、如何正確地設定您的專案以使用它們,以及您可能會遇到的所有已知問題。

如果要開始使用這些功能,您必須下載並安裝 Android Studio 2.1 (預覽版) 與 Android N Preview SDK,其中包括必要的 Jack 工具鏈與適用於 Gradle 的已更新 Android 外掛程式。如果尚未安裝 Android N Preview SDK,請參閱設定以針對 Android N 開發

注意:使用新的 Java 8 語言功能並不是開發以 Android N 平台為目標之應用程式的需求。如果不想使用 Java 8 語言功能撰寫程式碼,您可以將專案的來源與目標相容性值維持設定為 Java 7,但仍必須與 JDK 8 相容,以針對 Android N 平台建置。

支援的 Java 8 語言功能與 API

Android 目前不支援所有 Java 8 語言功能。然而,開發目標為「Android N Preview」的應用程式時,可以使用下列功能:

此外,下列 Java 8 語言功能 API 現已可用:

  • Reflection 與語言相關 API:
    • java.lang.FunctionalInterface
    • java.lang.annotation.Repeatable
    • java.lang.reflect.Method.isDefault()
    • 與 Reflection API (與可重複的註解關聯),例如 AnnotatedElement.getAnnotationsByType(Class)
  • 公用程式 API:
    • java.util.function

注意:Android N 的 Lambda 運算式實作是以匿名類別為基礎。此方法可讓它們向下相容並可在舊版 Android 上執行。如果要在舊版上測試 Lambda 運算式,請務必移至您的 build.gradle 檔案,並將 compileSdkVersiontargetSdkVersion 設定為 23 或更低的層級。

啟用 Java 8 功能與 Jack 工具鏈

如果要使用新的 Java 8 語言功能,您也必須使用新的 Jack 工具鏈。這個新的 Android 工具鏈可將 Java 語言原始程式碼編譯成 Android 可讀取的 Dex 位元組程式碼、具有其自己的 .jack 程式庫格式,並在單一工具之外提供最多工具鏈功能:重新封裝、縮減、混淆 (Obfuscation ) 與多 Dex (Multidex)。

以下是用來建置 Android DEX 檔案之兩個工具鏈的比較:

  • 傳統 javac 工具鏈:
    javac (.java --> .class) --> dx (.class --> .dex)
  • 新的 Jack 工具鏈:
    Jack (.java --> .jack --> .dex)

設定 Gradle

如果要為您的專案啟用 Java 8 語言功能與 Jack,請在您的模組特定 build.gradle 檔案中輸入下列內容:

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

已知問題

立即執行 (在 Android Studio 2.0 (Beta) 引進) 目前無法搭配 Jack 使用,而且會將它停用並使用新的工具鏈。

因為 Jack 在編譯應用程式時不會產生中繼類別檔案,相依於這些檔案的工具目前無法搭配 Jack 使用。這些工具的某些範例為:

  • 在類別檔案上運作的 Lint 偵測器
  • 需要應用程式類別檔案 (例如 JaCoCo 與 Mockito) 的工具與程式庫

如果在使用 Jack 時發現任何問題,請回報錯誤