Day 28 提到 compileOptions {}
區塊內,sourceCompatibility
和 targetCompatibility
的用途。
在建立/維護 Android 專案時,會遇到很多設定 JDK 版本的情況。
如果我們在 Android Studio 內的 Terminal 頁籤下指令 java --version
,會得到一個版本。
在切換不同路徑後使用同一個指令的結果如下圖。
但這不代表你的專案就是使用此 Java 版本做編譯。
由下圖可以看到,指令 java --version
只幫你找到本機電腦安裝的 Java 版本。等同於你從 Windows 作業系統 > 設定 > 應用程式與功能 所看到的版本。
如果直接從我處理專案的有限經驗來看,下列屬性宣告時,版本要對齊一致。
build.gradle(Module :app) 檔案
android {
...
// compileOptions 的 sourceCompatibility、targetCompatibility
// 及 kotlinOptions 的 jvmTarget
// 及 kotlin 的 jvmToolchain
// 都必須設置為相同的 Java 版本,否則會報錯
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_11.toString()
}
kotlin {
jvmToolchain(11)
}
}
依官方文件說明:
Specifying targetCompatibility and jvmTarget determines the Java class-format version used when generating bytecode for compiled Java and Kotlin source, respectively.
targetCompatibility
:決定編譯後 Java 來源生成 bytecode 的 Java class 格式版本。
jvmTarget
:決定編譯後 Kotlin 來源生成 bytecode 的 Java class 格式版本。
targetCompatibility defaults to the same value as sourceCompatibility, but if specified, must be greater than or equal to sourceCompatibility.
jvmTarget defaults to the toolchain version.
targetCompatibility
預設版本與 sourceCompatibility
相同。但如果有宣告 targetCompatibility
,其版本必須 >=
sourceCompatibility
版本。
jvmTarget
預設為工具鏈(toolchain)版本。
資料來源
Google for Developers - Android 建置中的 Java 版本
stackoverflow - How to specify the JDK version in Android Studio?
stackoverflow - Which java version should I use in Android Studio to build an app?
stackoverflow - What is the difference between "sourceCompatibility" and "targetCompatibility"?
Stefan M. - sourceCompatibility, targetCompatibility, and JVM toolchains in Gradle explained