Kotlin 新版来了,支持跨平台!

阅读 2051
收藏 2
2019-05-23
原文链接:mp.weixin.qq.com

   来源:开发者技术前线 

作者:Tamic  |  编辑: 可可

谷歌在今年的 I/O 大会上宣布,Kotlin 编程语言现在是 Android 应用程序开发人员的首选语言(谷歌宣布 Kotlin 成为安卓开发首选)。

还有一个好消息,   Kotlin 1.3.30 正式发布,做了对apple的支持。离上次发布1.3 时间过去半年。本次的该版本主要覆盖 1.3 版本的问题修复和工具完善。版本更新的主要范围为 Kotlin/Native、KAPT 的性能优化以及对 IntelliJ IDEA 的支持优化。

我们来回顾下 1.3的 新特性

  • 稳定的协程

  • Kotlin/Native Beta

  • 多平台项目和工具

  • 用于 Kotlin/Native 和多平台的工具

  • Ktor 1.0 Beta

本次版本带来的牛逼特性主要对1.3完善,并且做了工具上的支持。

KAPT 支持注解处理器增量编译

KAPT 已经支持注解处理器增量编译,该特性仍处灰度实验阶段,你可以通过在gradle.properties中添加以下配置来启用它:

   kapt .incremental .apt= true

需要指出的是,在现有版本中引入任何非增量编译的注解处理器或者依赖的变化(截止目前,包括内部声明的修改)都会导致该模块的注解处理过程退化为非增量模式。

KAPT: 其他提升

引入了两个配置来提升编译性能。其一是使用 Gradle workers:

kapt.use.worker.api=true

这个版本也对它做了优化。另一个是 1.3.20 引入的,开启 Compile Avoidance,就是说依赖如果只有方法体发生变化,那么就跳过注解处理。只有在所有的注解处理器都显式的在注解处理的 classpath 声明的情况下,Compile Avoidance 才会生效。

无符号数组的扩展方法

从 1.3 开始我们可以在开发模式下使用无符号数值类型。这个版本我们对无符号类型以及其数组做了更多的支持:

fun main() {val u1 = 2_147_483_649uval u2 = 4_000_000_000uprintln(u1.toDouble())println(minOf(u1, u2))val array: UIntArray = uintArrayOf(u1, u2)println(array.max())println(array.all { it > Int.MAX_VALUE.toUInt() })}

需要注意的是,我们之前就可以在无符号数组上使用函数式操作例如  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 环境上。

Kotlin/Native 对 Apple 平台的支持

对 Apple 平台的支持也有提升。iOS 上未处理的异常信息会被输出到 iOS 崩溃日志当中,iOS 和 macOS 上的异常堆栈(调试模式)也会包含符号信息。

现在也可以使用命令行参数  -Xstatic-framework  或者以下 Gradle 脚本来构建静态库:

需要注意的一点,现阶段官方表示拉取和编译这些依赖仍然需要一个 Xcode 工程。

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” 模式来查看变量。

Eclipse IDE 插件更新

Eclipse 插件 0.8.14 主要包含以下更新:Kotlin 1.3.30 编译器支持, 大量的问题修复和整体稳定性的提升。该版本也增加了对 Gradle 工程的实验性质的支持。你可以用 Eclipse Buildship 导入工程,你会发现 Kotlin 会被正常配置。

指定 JVM 版本

如果你的程序运行在 JVM 9, 10, 11, 或者 12 等版本下,你可以设置 jvmTarget到对应的版本了。这个设置会影响编译的 class 文件的字节码版本,但它们不是后向兼容的。相比之下,新目标版本不会有任何字节码优化也不会有任何新特性,期待后续Kotlin继续更新。

写在最后

无论 Google 对Kotlin 赋予什么期望,总而言之,Google提出新的系统和跨平台方案,意味着Android 生态已经向不同领域发力,最近微软的反击也预示者,Google的跨端计划已经对微软形成了火力压制,坐等大安卓起飞,移动开发下一春不远了。

于此同时微软也在大力发展自己的.net语言的跨平台,并且也在支持 Pyhon开发语言的各种工具,其实是在对 Flutter和Kotlin 提出了挑战。

大家如何看待 Kotlin 的未来? 欢迎交流

评论