使用 Java 8 語言功能

Android Studio 3.0 及以上版本支持全部 Java 7 語言功能,以及部分 Java 8 語言功能(具體因平臺版本而異)。 本頁介紹您可使用的 Java 8 語言功能、如何正確配置項目以使用這些功能以及您可能遇到的任何已知問題。html

注:在開發 Android 應用時,能夠選擇使用 Java 8 語言功能。 您能夠將項目的源代碼和目標代碼兼容性值保留爲 Java 7,但仍須使用 JDK 8 進行編譯。java

Android Studio 爲使用部分 Java 8 語言功能及利用這些功能的第三方庫提供內置支持。 如圖 1 所示,默認工具鏈對 javac 編譯器的輸出執行字節碼轉換(稱爲 desugar),從而實現新語言功能。 Jack 再也不受支持,您須要首先停用 Jack 才能使用默認工具鏈內置的 Java 8 支持。android

圖 1. 採用 desugar 字節碼轉換的 Java 8 語言功能支持。git

 

 

要開始使用受支持的 Java 8 語言功能,請更新 Android 插件到 3.0.0(或更高版本)。 而後,針對使用(包括在源代碼中或經過依賴項使用)Java 8 語言功能的每一個模塊,在其 build.gradle 文件中添加如下代碼:github

android {
  ...
  // Configure only for each module that uses Java 8
  // language features (either in its source code or
  // through dependencies).
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

注:若是 Android Studio 檢測到您的項目使用的是 Jack、Retrolambda 或 DexGuard,IDE 則會使用由這些工具提供的 Java 8 支持。 但您能夠考慮 遷移至默認工具鏈api

支持的 Java 8 語言功能和 API

雖然 Android Studio 並不是支持全部 Java 8 語言功能,但將來發布的 IDE 版本將會增長更多功能。 目前,部分功能和 API 已可以使用,具體取決於您所使用的 minSdkVersion,詳見下表。android-studio

除了上述 Java 8 語言功能和 API 以外,Android Studio 3.0 及更高版本還將對 try-with-resources 的支持擴展到全部級別的 Android API。oracle

Desugar 目前暫不支持 MethodHandle.invoke 或 MethodHandle.invokeExact。 若是您的源代碼或任一模塊依賴項使用了其中一種函數,則需指定 minSdkVersion 26 或更高版本。 不然會出現如下錯誤:app

 
Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

在某些狀況下,即便您的模塊包含在庫依賴項中,也可能不會使用 invoke 或 invokeExact 函數。 所以,要繼續使用 minSdkVersion 25 或更低版本的庫,請經過啓用代碼壓縮 移除未使用的函數。 若是這種方法無效,可考慮使用一個替代庫,該庫不使用未受支持的函數。jvm

遷移至默認工具鏈

若是 Android Studio 檢測到您的項目使用了 Jack、Retrolambda 或 DexGuard,IDE 則會使用由這些工具提供的 Java 8 支持。 但與默認工具鏈相比,這些工具缺少部分功能和支持。 因此,請參照本節說明遷移至 Android Studio 的默認工具鏈。

從 Jack 遷移

根據此公告Jack 工具鏈已經被棄用。 若是您的項目依賴 Jack,則應執行遷移,以便享受到 Android Studio 默認工具鏈所內置的 Java 8 支持。 使用默認工具鏈還支持使用 Java 8 語言功能的第三方庫、Instant Run 以及依靠 .class 中間文件的工具。

要停用 Jack 並切換至默認工具鏈,只需從您的模塊 build.gradle 文件中移除 jackOptions 塊便可:

android {
    ...
    defaultConfig {
        ...
        // Remove this block.
        jackOptions {
            enabled true
            ...
        }
    }

    // Keep the following configuration in order to target Java 8.
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

從 Retrolambda 遷移

與 Android Studio 的默認工具鏈相比,Retrolambda 缺乏對使用 Java 8 語言功能的第三方庫的支持。 要遷移到默認工具鏈,請從您的項目級 build.gradle 文件中移除 Retrolambda 依賴項:

buildscript {
  ...
   dependencies {
      // Remove the following dependency.
      classpath 'me.tatarka:gradle-retrolambda:<version_number>'
   }
}

同時移除每一個模塊 build.gradle 文件中的 Retrolambda 插件和 retrolambda 塊:

// Remove the following plugin.
apply plugin: 'me.tatarka.retrolambda'
...
// Remove this block after migrating useful configurations.
retrolambda {
    ...
    // If you have arguments for the Java VM you want to keep,
    // move them to your project's gradle.properties file.
    jvmArgs '-Xmx2048m'
}

停用對 Java 8 語言功能的支持

若是您遇到與 Java 8 語言功能支持相關的問題,可在 gradle.properties 文件中加入如下代碼來停用此支持:

android.enableDesugar=false
相關文章
相關標籤/搜索