Kotlin Symbol Processing (KSP) Alpha 版现已发布

Kotlin Symbol Processing (KSP) Alpha 版现已发布

作者 / 软件工程师 Ting-Yuan Huang 和产品经理 David Winer

我们很高兴地向您介绍 Kotlin Symbol Processing (KSP) 的 Alpha 版,帮助您在 Kotlin 中构建轻量级编译器插件的全新工具。KSP 提供的功能类似于 KAPT,但速度提高了 2 倍,可以直接访问 Kotlin 编译器功能,并且开发时充分考虑到了多平台兼容性。

KSP 兼容 Kotlin 1.4.30 及更高版本。您可以在 KSP GitHub repo 中查看开放源代码和文档。

为何推出 KSP?

Kotlin 开发者向我们反馈最多的需求就是提高构建速度。许多开发者每天都要迭代并部署数十次应用,所以构建速度缓慢会使开发者不得不将大量时间耗费在等待上。编译 Kotlin 代码的最大挑战之一是 Kotlin 没有原生注释处理系统。诸如 Room 等注释处理器在 Android 平台无处不在,它们依赖于通过 Kotlin 注释处理工具 (KAPT) 实现的 Java 注释处理兼容性。但是,KAPT 的运行速度可能会很慢,因为它需要生成中间的 Java 存根,然后 Java 注释处理系统才能对其进行提取。

在设计 KSP 时,我们考虑了如果从头开始构建,Kotlin 的注释处理应是怎样的形式。KSP 提供了一个功能强大且简单的 API,它可以直接解析 Kotlin 代码,因此大大降低了 KAPT 生成存根所带来的构建速度负担。实际上,利用 Room 库执行的初始基准测试表明,KSP 相比 KAPT 速度提高了 2 倍左右。

开始使用

要查看 KSP 的实际运行情况,请从 GitHub 下载 KSP Playground 项目。您可以从中获得:

  • : 将构建器模式作为 KSP 处理器实现的小型 test-processor 库
  • 使用项目: 显示如何在实际 Kotlin 项目中使用构建器处理器的 workload 目录

实现构建器的所有逻辑全部位于 test-processor 中 - 对于使用者 (workload) 来说,使用 KAPT 和使用 KSP 的唯一区别是更改了两行构建文件:

这是 KSP 的目标: 大多数 Android 应用开发者无需担心其内部结构;除了这一行更改以外,支持 KSP 的库类似于普通的注释处理器,而速度却提高了 2 倍。也就是说,在同一模块中使用 KAPT 和 KSP 最初可能会降低您的构建速度,因此在 Alpha 版期间,最好在单独的模块中使用 KSP 和 KAPT。

随着越来越多的注释处理器采用 KSP,我们希望您的大多数模块都能够使用 KSP 来直接替代 KAPT。现在,您可以在 表格 中查看哪些注释处理器提供了 KSP 支持。如果表中缺少已支持或正在实现 KSP 支持的库,请将您的宝贵建议反馈给我们!

如果您是当前某个使用注释处理的库作者,可以在 快速入门README 指南中找到有关如何使您的库与 KSP 兼容的更多信息。

对于库作者而言,KSP 目前所处的 Alpha 版阶段是对其深入研究的良好契机,欢迎您在 KSP 问题跟踪器 中向我们提供有关 API 的反馈。此外,我们会在谷歌开发者公众号和 Kotlin Slack 的 #ksp 频道上定期发布版本动态。自去年 6 月的开发者预览版发布以来,我们已经解决了超过 100 项错误和问题,其中数十项都来自优秀的 Kotlin 库开发者社区的反馈。希望您可以继续将问题通过 KSP 问题跟踪器 反馈给我们,或在文章下方进行留言。

Java 是 Oracle 和/或其附属公司的注册商标。

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io Funder | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.
🍗