Kotlin 1.3.30 正式发布

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 的支持,尽管目前代码补全功能还没有上线。

c-interop-def

对于 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 增量编译的支持

感谢社区的贡献者,大家都是最棒的 ~ 这其中特别要感谢的是:

此条目发表在官方博客分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注