我们很高兴地宣布Kotlin 1.3.40正式版在今天发布! 除了质量及工具的改善外,该版本的更新内容重点如下:
- 为Kotlin/JS提供NPM,Yarn和Webpack的Gradle支持
- 改进了多平台项目的测试执行器
- 新的类型推断
- Kotlin/Native性能和互操作性的改进
同时,新的函数以实验的形式加入到了标准库中
你可以在更新日志中查看完整的列表。我们一如既往地感谢这些贡献者。
下面将为你展示这次的更新内容。
标准库中的实验函数
我们往标准库里引入了几个实验性质的函数。都是用于将字节或字符数组编/解码为UTF-8编码字符串的常用函数,包括:
ByteArray.decodeToString
和String.encodeToByteArray
CharArray.concatToString
和String.toCharArray
另一个实验性函数capitalize
被添加到JVM上,它以Locale
对象作为参数。
它们都不是默认可用的,可以通过注解@UseExperimental(ExperimentalStdlibApi::class)
或在编译器中指定配置项-Xuse-experimental=kotlin.ExperimentalStdlibApi
来使用新增的实验性函数。

这个版本中引入的 ExperimentalStdlibApi
注解,用以注明那些实验性质的API。这些API的行为会根据用户的反馈进行调整,因此并不承诺其兼容性。你可以在该文档中获取有关实验性注解的更多信息。
在JVM上通过反射访问reified类型
该正式版本添加的另一个实验性函数是typeOf
。如你所见,其能为指定的类型构造一个KType
实例:
在需要获取泛型的类型信息时,就能体会到好处了。当你对一个已确定类型的泛型T
调用typeOf()
,typeOf
会返回该泛型的实际类型:
目前来说,typeOf
只能用于Kotlin/JVM平台上,但在未来的版本中,会有类似的函数登陆其他平台:Kotlin/JS和Kotlin/Native。
对于trimIndent和trimMargin的优化
为了更好的代码排版,通常横跨多行的字符串会伴随着trimIndent
或trimMargin
方法的调用。从该正式版开始,编译器将会优化trimIndent
和trimMargin
的调用。这并非只是依赖库函数,而是编译器在字节码中直接生成经过修剪的字符串:
目标平台:运行kotlin v. 1.3.40的JVM
请注意该优化只会针对字符串常量表达式,并不适用于字符串模版(例如"$x"
)。
minBy
和maxBy
函数也得到优化,当其调用者集合只包含一个元素时,不再调用指定的selector
函数。如果你依赖于selector
函数带来的副作用,请留意该优化的影响。
在IntelliJ IDEA上使用外部注解
如果你用到了Java的外部空检查注解,IDE现在会对Kotlin中带该注解Java方法的错误调用进行警告了。
想象一下你的Java方法标记了外部的注解。IDEA可以正常显示该注解,但它实际并不存在于代码之中。

该注解会被声明在独立的annotations.xml
文件中:
1 2 3 4 5 |
<root> <item name="JavaClass java.lang.String nullableString()"> <annotation name="org.jetbrains.annotations.Nullable"/> </item> </root> |
从该版本开始,Kotlin中Java方法的错误调用会被标记为warning:

注意这只是纯粹的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/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源码映射的支持。

你可以轻松地配置适合在不同浏览器中运行的浏览器测试。插件为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 IDEA 和Android 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
Pingback引用通告: Kotlin 1.4.0-RC! - KotlinCn