Kotlin 1.3.40正式发布

我们很高兴地宣布Kotlin 1.3.40正式版在今天发布! 除了质量及工具的改善外,该版本的更新内容重点如下:

  • 为Kotlin/JS提供NPM,Yarn和Webpack的Gradle支持
  • 改进了多平台项目的测试执行器
  • 新的类型推断
  • Kotlin/Native性能和互操作性的改进

同时,新的函数以实验的形式加入到了标准库中

你可以在更新日志中查看完整的列表。我们一如既往地感谢这些贡献者

下面将为你展示这次的更新内容。

标准库中的实验函数

我们往标准库里引入了几个实验性质的函数。都是用于将字节或字符数组编/解码为UTF-8编码字符串的常用函数,包括:

  • ByteArray.decodeToStringString.encodeToByteArray
  • CharArray.concatToStringString.toCharArray

另一个实验性函数capitalize被添加到JVM上,它以Locale对象作为参数。

它们都不是默认可用的,可以通过注解@UseExperimental(ExperimentalStdlibApi::class)或在编译器中指定配置项-Xuse-experimental=kotlin.ExperimentalStdlibApi来使用新增的实验性函数。

img

这个版本中引入的 ExperimentalStdlibApi注解,用以注明那些实验性质的API。这些API的行为会根据用户的反馈进行调整,因此并不承诺其兼容性。你可以在该文档中获取有关实验性注解的更多信息。

在JVM上通过反射访问reified类型

该正式版本添加的另一个实验性函数是typeOf。如你所见,其能为指定的类型构造一个KType实例:

在需要获取泛型的类型信息时,就能体会到好处了。当你对一个已确定类型的泛型T调用typeOf()typeOf会返回该泛型的实际类型:

目前来说,typeOf只能用于Kotlin/JVM平台上,但在未来的版本中,会有类似的函数登陆其他平台:Kotlin/JS和Kotlin/Native。

对于trimIndent和trimMargin的优化

为了更好的代码排版,通常横跨多行的字符串会伴随着trimIndenttrimMargin方法的调用。从该正式版开始,编译器将会优化trimIndenttrimMargin的调用。这并非只是依赖库函数,而是编译器在字节码中直接生成经过修剪的字符串:

目标平台:运行kotlin v. 1.3.40的JVM

请注意该优化只会针对字符串常量表达式,并不适用于字符串模版(例如"$x")。

minBymaxBy函数也得到优化,当其调用者集合只包含一个元素时,不再调用指定的selector函数。如果你依赖于selector函数带来的副作用,请留意该优化的影响。

在IntelliJ IDEA上使用外部注解

如果你用到了Java的外部空检查注解,IDE现在会对Kotlin中带该注解Java方法的错误调用进行警告了。

想象一下你的Java方法标记了外部的注解。IDEA可以正常显示该注解,但它实际并不存在于代码之中。

annotatedJavaMethod

该注解会被声明在独立的annotations.xml文件中:

从该版本开始,Kotlin中Java方法的错误调用会被标记为warning:

nullabilityWarning

注意这只是纯粹的IDE功能,Kotlin编译器会忽略警告去编译相关的代码。nullableString(可空的字符串)仍然会被编译器推断为平台相关类型String!(不可空的字符串),只是IDE会有额外的warning提醒。

新的类型推断算法

我们一直致力于完善类型推断算法,修复了不同的边界问题以满足各种各样的场合: 完整的问题修复列表让人激动万分。在Kotlin的未来版本,新算法将会取代旧算法成为默认算法。

我们非常关心替换新算法的向后兼容性。因此我们在当前版本中对IDE默认开启了该算法,以便收集实际使用中的反馈。 请注意可能出现代码在IDE中没有异常但却无法通过编译器的情况,这是因为修正了复杂的边界bug导致的。如果你看到如代码在IDE被标红但却能通过编译或反之亦然的不一致情况,请向我们提交issue。如果该模式导致你的项目无法正常运行,在Preferences里的Kotlin Compiler页下取消勾选Enable new type inference algorithm for IDE analysis即可(Android Studio下该选项位于其他位置:Preferences | Kotlin Compiler)。

我们期待你的反馈!

多平台项目 (MPP)

Kotlin/Native和Kotlin/JS的测试执行器现在实现了Gradle Test执行器的所有API,其执行方式近似于Kotlin/JVM测试执行器。控制台会打印带导航的源码错误报告。同时Gradle也会生成测试报告。通过标准的Gradle参数支持传递测试过滤参数,例如: --tests some.test.ClassName

可以通过Gradle生成一份完整的测试运行报告,包含所有目标平台上的信息,这些平台包括:Kotlin/Native,Kotlin/JS和Kotlin/JVM。

kotlin-1.3.40-test-runner-report

Kotlin/JS

Kotlin/JS的增量编译性能得到了提升。特别在某些大型项目 和/或 模块有大量依赖的情况下,其编译较之前缩短了多达30%的时间。

该版本中Kotlin/JS最显著的变化来自工具方面。我们很高兴地介绍Gradle上已经更新的Kotlin/JS插件,我们将其重命名为org.jetbrains.kotlin.js,现在可以在Gradle plugin portal上获取。只需要在build.gradle中通过plugins {}语法启用即可:

或者在build.gradle.kts文件中调用kotlin函数:

我们正在努力将kotlin-frontend-plugin插件的所有功能移植到Kotlin/JS插件和Kotlin/Multiplatform插件中。部分功能已经在测试中。我们计划在这项工作完成后弃用kotlin-frontend-plugin

对NPM和Webpack的实验支持

今天,我们很高兴与你分享一些实验性功能,以帮助简化采用Node.js,NPM,Yarn或Webpack的JavaScript项目开发。我们在Kotlin/JS和Multiplatform Gradle插件中添加了一些辅助任务,以简化集成。该插件将为你的项目生成一个临时的package.json,它将下载并使用Yarn自动管理NPM依赖项和node_modules。 Webpack将在后台启动,以加入所有依赖项,并根据你的代码创建浏览器友好的脚本。

该插件会将Gradle项目中声明的所有Kotlin/JS依赖项附加到自动维护的node_modules文件夹中。现在,JS SourceSet的dependencies {}块中新添加的npm函数可以在Gradle脚本添加NPM依赖项:

Yarn Workspaces用于多平台项目的Gradle构建。每个子项目会创建一个工作目录,并在根项目的目录下进行配置。这允许Yarn通过提取对根node_modules的公共依赖来减少子项目中的node_modules副本。

Node.js和浏览器模式

JavaScript项目的运行和测试始终取决于环境。我们已经添加了对Node.js和浏览器执行环境的支持。你可以使用nodejs {}browser {}函数为Kotlin/JS和Multiplatform Gradle插件配置Kotlin。

该Gradle插件会下载并安装(当然是通过Yarn) 所有必要的NPM依赖,包括用于Karma测试的无UI浏览器,去测试你的代码。Mocha测试框架将用于在Node.js环境中运行测试。测试执行器与Gradle集成,并实现与Kotlin/JVM测试类似的功能。例如,测试失败将显示在控制台中,会生成测试报告,Gradle命令行能接收测试过滤器。

有时很难追溯并改善代码中的错误,因此我们在Gradle插件中为所有的这些任务添加了JavaScript源码映射的支持。

kotlin-1.3.40-tests

你可以轻松地配置适合在不同浏览器中运行的浏览器测试。插件为Karma测试执行器配置好NPM依赖项,并使其运作起来。Gradle中可能会用到以下的DSL:

会在Gradle插件中添加了一个run任务,用于在Node.js或Browser环境中执行Kotlin/JS代码。

注意,新的Kotlin/JS构建功能是实验性的,目前仅支持macOS和Linux。 Windows的支持将在稍后添加。

Kotlin/Native

在内存管理器中包含了一些改进以提高Kotlin/Native应用程序的性能。我们从基准测试中观察到性能提升了将近两倍。

为Linux添加了ARM x64(ARM / AArch64)的支持。 CoreLocation框架是预加载并已包含在macOS上。我们改进了Kotlin/Native编译器对日志记录和错误消息的显示。

FreezableAtomicReference是Kotlin/Native中包含的新实验性,用于帮助处理多线程和并发。它的作用类似于“AtomicReference”类,而不论它是否被冻结。

kotlin-platform-native已被弃用。请迁移到kotlin-multiplatform Gradle插件。查看文档以了解迁移指南和更多信息。

我们还删除了kotlin-multiplatform Gradle插件中之前被弃用的用以配置Kotlin/Native的API。从1.3.40开始,不再支持compilations.outputKinds,请使用binaries API。

互操作性

该版本已包含对Kotlin/Native生成的框架的实验性泛型支持。它将通用参数的类型信息添加到Objective-C/Swift生成的Kotlin/Native泛型类中。该功能默认是关闭的,要启用它,将-Xobjc-generics作为命令行参数传递给编译器,或将这堆东西添加到Gradle项目配置中:

除此之外,Kotlin的Unit类型将在生成的框架中变成Void类型。 Kotlin/Native方法名称将不会与Objective-C声明冲突,因为我们已经改进了生成方法名称的方式。现在支持在互操作中调用Objective-C的可变参函数。

现在和C的互操作中已支持可空的字符串了。我们使用自定义的异常钩子修复了该问题;现在,你可以在代码中使用setUnhandledExceptionHook {}函数来捕获未被处理的Kotlin异常。

Kotlin/Native中的测试

我们为Kotlin/Native测试添加了一个单独的二进制类型。现在更容易指引build去创建Native的测试可执行文件:

Kotlin/Native测试执行器现在已与Gradle集成,并实现了类似于Kotlin/JVM上测试执行器的功能,例如,控制台会显示测试失败,并生成测试报告,同时你可以将测试过滤器传递给Gradle命令行。

现在,使用binaries.getTest函数通过Gradle API获取测试二进制文件更加容易。而查找测试可执行文件的旧方法,例如`binaries.getExecutable(“test”,“DEBUG”)将不再有用,请使用新的API:binaries.getTest(“DEBUG”)

如何升级

像往常一样,你可以在play.kotl.in在线体验Kotlin

  • 对于Maven, Gradle, 和npm:配置编译器及标准库的版本为1.3.40 请参考文档.
  • 对于IntelliJ IDEAAndroid Studio:要将Kotlin升级到1.3.40。打开Tools | Kotlin | Configure Kotlin Plugin Updates并点击“Check for updates now” 按钮。
  • 对于Eclipse:在Marketplace安装Kotlin插件。
  • 对于命令行编译器Github release page可以下载获取。

如果你在新版本遇到任何问题,欢迎在Slack上的论坛上寻求帮助(这里获取邀请),或在问题跟踪器提交问题。

请尽情享受Kotlin!

其余贡献者

我们特别感谢Kevin Galligan他的贡献adding support of generics in Kotlin/Native produced frameworks.

我们非常感谢提交了PR并被合并到该正式版中的其他贡献者:

  • Dimach
  • Toshiaki Kameyama
  • pyos
  • Mark Punzalan
  • Ivan Gavrilovic
  • Ting-Yuan Huang
  • Steven Schäfer
  • Burak Eregar
  • Dereck Bridie
  • Jake Wharton
  • Mads Ager
  • Kirill Knize
  • gcx11
  • Austaon
  • Ryan
  • Jan Gerling
  • Harry Billinis
  • Georgios Andrianakis
  • George Gastaldi
  • Eduard Wolf
  • Caleb Brinkman
  • Wil
  • Benjamin Orsini
  • Yanis Batura
  • ilgonmic
  • Kenji Tomita
  • Matthew Runo
  • Kirill Rakhman
  • Kevin Galligan
  • Kevin Peek
  • Kerooker
  • Juan Chen
  • Nikolay Kasyanov
  • Jorge Antonio Díaz-Benito Soriano
  • Pavel Nikitin
  • Peter Xu
  • Rene Groeschke
  • Jiaxiang Chen
此条目发表在官方博客分类目录。将固定链接加入收藏夹。

发表评论

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