iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0

Day 28 提到 compileOptions {} 區塊內,sourceCompatibilitytargetCompatibility 的用途。

在建立/維護 Android 專案時,會遇到很多設定 JDK 版本的情況。

如果我們在 Android Studio 內的 Terminal 頁籤下指令 java --version,會得到一個版本。
在切換不同路徑後使用同一個指令的結果如下圖。

https://ithelp.ithome.com.tw/upload/images/20231013/20151956HMMsLbK2aY.png

但這不代表你的專案就是使用此 Java 版本做編譯。
由下圖可以看到,指令 java --version 只幫你找到本機電腦安裝的 Java 版本。等同於你從 Windows 作業系統 > 設定 > 應用程式與功能 所看到的版本。

https://ithelp.ithome.com.tw/upload/images/20231013/20151956N6DusDNFAD.png

如果直接從我處理專案的有限經驗來看,下列屬性宣告時,版本要對齊一致。

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


上一篇
[Day 28] compileOptions
下一篇
[Day 30] 管理版本號碼
系列文
[Android] 怎麼蓋地基?論 build.gradle 與它的快樂夥伴們30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言