Kotlin 1.3.30 正式釋出,該版本主要覆蓋 1.3 版本的問題修復和工具完善。版本更新的主要範圍為 Kotlin/Native、KAPT 的效能最佳化以及對 IntelliJ IDEA 的支援最佳化。
相信更新內容見 版本更新日誌.
我們也一如既往地感謝來自 外部貢獻者的大力支援
。好,閒話少敘,我們進入正題。
KAPT 支援註解處理器增量編譯
KAPT 已經支援註解處理器增量編譯,該特性仍處灰度實驗階段,你可以透過在gradle.properties
中新增以下配置來啟用它:
需要指出的是,在現有版本中引入任何非增量編譯的註解處理器或者依賴的變化(截止目前,包括內部宣告的修改)都會導致該模組的註解處理過程退化為非增量模式。
後續我們也會持續跟進該項功能的完善,也懇請大家開始嘗試並給出反饋~
KAPT: 其他提升
1.2.60 以來,我們引入了兩個配置來提升編譯效能。其一是使用 Gradle workers:
這個版本我們也對它做了最佳化。
另一個是 1.3.20 引入的,開啟 Compile Avoidance,就是說依賴如果只有方法體發生變化,那麼就跳過註解處理。只有在所有的註解處理器都顯式的在註解處理的 classpath 宣告的情況下,Compile Avoidance 才會生效,為此我們需要禁止在編譯路徑下搜尋註解處理器以啟用 Compile Avoidance:
在後續版本中我們會預設開啟這兩個配置,因此希望大家積極體驗並給予反饋~
哦對了,我們現在支援的 Gradle 最低版本是 4.1,相應的 Android Graldle Plugin 則是 3.0。
標準庫: 無符號陣列的擴充套件方法
從 1.3 開始我們可以在實驗模式下使用無符號數值型別。這個版本我們對無符號型別以及其陣列做了更多的支援:
需要注意的是,我們之前就可以在無符號陣列上使用函式式操作例如 filter
和 map
,這是因為無符號型別的陣列實際上是實現了 Collection
介面的,例如 UIntArray
實現了 Collection<UInt>
介面。 不過這樣就涉及到了效能問題,因為在 UIntArray
被當作 Collection<UInt>
的例項使用時會額外 建立 一個物件出來。現在好了,所有新增的擴充套件函式都使用無符號陣列型別作為 receiver 以消除額外的物件建立開銷。因此不用擔心,現在無符號陣列和常規數值型別的陣列從使用的角度來講沒有什麼兩樣,不會有任何額外的開銷了。
Kotlin/Native
Kotlin/Native 支援的目標平臺有了新成員: Windows 32 位(mingw_x86)。除此之外,Windows 和 macOS 使用者也可以交叉編譯 Kotlin/Native 程式到 Linux x86-64、arm32 以及 Android 和 Raspberry PI 環境上。
我們也從編譯器的層面修復了除0取餘時的未定義行為,現在會直接編譯報錯。ARM32 和 MIPS 對齊相關的問題也得到了修復。
Kotlin/Native 對 Apple 平臺的支援
對 Apple 平臺的支援也有提升。iOS 上未處理的異常資訊會被輸出到 iOS 崩潰日誌當中,iOS 和 macOS 上的異常堆疊(除錯模式)也會包含符號資訊。
現在也可以使用命令列引數 -Xstatic-framework
或者以下 Gradle 指令碼來構建靜態庫:
Cocoapods
CocoaPods 也開始得到了 Gradle 外掛的實驗性質的支援。 它將 Kotlin/Native 工程轉成 .podfile
依賴,這樣就可以被引入到其他 Podfile
當中。這樣將使得開發者獲得與用 Xcode 一致的開發體驗,就像你過去用 Swift 和 Objective-C 的 pod 依賴一樣。同樣的,我們也讓 Kotlin/Native 工程引入 CocoaPods 依賴變得更方便,這其中 Gradle 外掛會幫我們完成所有必須的配置環節。
需要指出的是,現階段拉取和編譯這些依賴仍然需要一個 Xcode 工程。
執行 ./gradlew podspec
就可以生成一個 .podspec
檔案用來引入到其他 Podfile
當中。引入一個 pod 依賴,可以使用 pod()
函式。
C interop
該版本開始支援返回結構體型別的回撥函式,這意味著 staticCFunction
可以返回 CValue<T>
型別了!例如我們可以呼叫一個 C 函式,傳入另外一個返回值型別為結構體的 Kotlin 實現的 C 函式指標:
另外,還有以下更新:
- C-99
bool
型別可以正確對映 - UTF-32 C 字串對映成 Kotlin
String
型別 - C 編譯器內部函式對映到
platform.builtins
包中 - 不再使用libffi 庫
- Objective-C interop 時支援 Clang 模組
- C interop 描述檔案 (
.def
) 獲得 IDE 支援
Kotlin/Native IDE 支援
接下來我們同步下我們的 IDE 對 Kotlin/Native 的支援工作的進展。
除 IntelliJ IDEA 之外,我們也將釋出 Kotlin/Native 外掛支援 CLion 2019.1、AppCode 2019.1。C interop 描述檔案 (.def
) 後續也會得到所有 IDE 的支援,儘管目前程式碼補全功能還沒有上線。
對於 CLion and AppCode, 我們也支援了異常堆疊跳轉原始碼的支援。
IntelliJ IDEA 支援
除錯功能的提升
當你在除錯協程程式碼時,你可以看到有一個單獨的非同步堆疊 “Async stack trace” 顯示掛起時的變數。看一個例子:
當程式在 suspend 函式或者 Lambda(例子的第 13行)中的斷點停止時, “Async stack trace” 顯示了變數在上一次掛起時的狀態(12行)。你可以瀏覽 suspend 函式在當前協程中從上一個掛起點的全部的堆疊 (第12、4行)並確認變數的值:
這會幫助你更方便的理解當前協程的執行狀態。
在除錯 Kotlin 程式碼時,你可以選擇 “Kotlin” 模式來檢視變數。點選 Kotlin icon,你就可以看到變數的 Kotlin 名字,而不是底層的 Jvm 名字:
你也可以新增變數到 watches,將 watches 和 variables 合在一起或是分開顯示,隨你便。
Scratch 檔案的互動模式
在 Kotlin 當中,你可以用 scratch files來做些基於你的程式碼環境的小測試。現在你也可以開啟互動模式,這樣執行結果就可以在一定的延時後自動顯示而無需手動執行:
其他特性提升
你會經常檢查你的 TODO 項嗎?IntelliJ IDEA 現在可以正確的高亮多行 TODO 註釋了:
一些有用的檢查和快速修復也會跟隨這版本釋出,例如對已經引入的類名的別名的自動引入的問題修復,以及對使用 Java 8 而不是 Kotlin 標準庫的 ‘forEach’ 方法的警告。
Eclipse IDE 外掛更新
Eclipse 外掛 0.8.14 主要包含以下更新:Kotlin 1.3.30 編譯器支援, 大量的問題修復和整體穩定性的提升。該版本也增加了對 Gradle 工程的實驗性質的支援。你可以用 Eclipse Buildship 匯入工程,你會發現 Kotlin 會被正常配置。
你可以透過 https://dl.bintray.com/jetbrains/kotlin/eclipse-plugin/last/
安裝對 Gradle 的實驗性質的整合
從 help 選單開啟 Install new software
對話方塊,輸入更新地址並且選擇 Kotlin-gradle
即可:
新 Gradle 整合也支援 Spring Tool Suite。你再也不用強迫自己用 maven 構建用 Kotlin 開發的 Spring 應用了。
指定 JVM 位元組碼版本為 9 – 12
如果你的程式執行在 JVM 9, 10, 11, 或者 12 等版本下,你可以設定 jvmTarget
到對應的版本了。這個設定會影響生產的 class 檔案的位元組碼版本,它們不是後向相容的,這一點請注意。相比之下,新目標版本不會有任何位元組碼最佳化也不會有任何新特性,不過這種情況不會長久的。
如何更新
你可以到 play.kotl.in 上線上體驗 Kotlin 新版本。
- Maven, Gradle and npm: 修改編譯器和標準庫的版本為
1.3.30
。詳細請參見 這裡。 - IntelliJ IDEA 和 Android Studio: 更新 Kotlin 外掛到 1.3.30。 使用 Tools | Kotlin | Configure Kotlin Plugin Updates 並點選 “Check for updates now” 按鈕即可。
- Eclipse: 在 Marketplace中安裝外掛。
- 命令列編譯器 可以在 Github release 頁面下載。
一如既往地,如果遇到了什麼問題,不要慌,到 中文論壇轉一轉,或者到 QQ 群裡討論下,如果英文比較好,也可以到官方論壇提問或者上 Slack (獲取邀請連結 點這裡) 討論,還可以到 issue tracker 上提 issue.
Let’s Kotlin!
鳴謝
特別感謝來自 Google 的同事的對 KAPT 增量編譯的支援!
感謝社群的貢獻者,大家都是最棒的 ~ 這其中特別要感謝的是:
- Toshiaki Kameyama
- Mads Ager
- Ivan Gavrilovic
- Ting-Yuan Huang
- Dereck Bridie
- denisgaebler
- kenji tomita
- Bernhard Posselt
- Wil
- Burak Eregar
- Marcin Moskala
- Felix Guo
- shiraji
- Tor Norbye
- Yaroslav Ulanovych
- goodsauce
- hisaaki.sioiri
- Pavel Nikitin
- Mark Punzalan
- Kevin Peek
- Jim S
- Timo Obereder