12.4.11 KSP 常见问题
3 分钟阅读
12.4.11 KSP 常见问题
为什么选择 KSP?
与 kapt 相比,KSP 有几个优势:
- 它更快。
- 对 Kotlin 用户来说 API 更流畅。
- 它支持对生成的 Kotlin 源码进行多轮处理。
- 它在设计时就考虑了多平台兼容性。
为什么 KSP 比 kapt 更快?
kapt 必须解析并解析每一个类型引用才能生成 Java 桩文件,而 KSP 按需解析引用。委托给 javac 也会消耗时间。
此外,KSP 的增量处理模型比单纯的隔离与聚合粒度更细。它能找到更多避免重新处理一切的机会。而且,由于 KSP 会动态追踪符号解析,某个文件中的改动不太可能污染其他文件,因此需要重新处理的文件集合更小。kapt 无法做到这一点,因为它把处理委托给了 javac。
KSP 是 Kotlin 专属的吗?
KSP 也能处理 Java 源码。API 是统一的,也就是说当你解析一个 Java 类和一个 Kotlin 类时,在 KSP 中得到的是统一的数据结构。
如何升级 KSP?
KSP 包含 API 和实现两部分。API 很少变化并且向后兼容:可能会新增接口,但旧接口永不改变。实现则与特定的编译器版本绑定。随着新版本发布,所支持的编译器版本可能发生变化。
处理器只依赖 API,因此不与编译器版本绑定。不过,处理器的使用者在自己项目升级编译器版本时,需要相应提升 KSP 版本。否则会出现以下错误:
| |
注意: 处理器的使用者不需要提升处理器的版本,因为处理器只依赖 API。
例如,某个处理器发布时使用 KSP 1.0.1 进行测试,而 KSP 1.0.1 严格依赖 Kotlin 1.6.0。要让它与 Kotlin 1.6.20 配合工作,你唯一需要做的就是把 KSP 提升到为 Kotlin 1.6.20 构建的版本(例如 KSP 1.1.0)。
可以在较旧的 Kotlin 编译器上使用较新的 KSP 实现吗?
如果语言版本相同,Kotlin 编译器应当是向后兼容的。大多数情况下,升级 Kotlin 编译器应该很容易。如果你需要更新的 KSP 实现,请相应地升级 Kotlin 编译器。
你们多久更新一次 KSP?
KSP 尽量遵循语义化版本。对于 KSP 版本 major.minor.patch:
major保留给不兼容的 API 变更。没有预先确定的时间表。minor保留给新特性。大约每季度更新一次。patch保留给缺陷修复和新的 Kotlin 版本适配。大约每月更新一次。
通常在新 Kotlin 版本发布后的几天内就会有对应的 KSP 版本,包括预发布版本(Beta 或 RC)。
除了 Kotlin 之外,库还有其他版本要求吗?
下面是库/基础设施的要求列表:
- Android Gradle Plugin 7.1.3+
- Gradle 6.8.3+
KSP 未来的路线图是什么?
已规划以下事项:
- 支持新的 Kotlin 编译器
- 改进多平台支持。例如在目标的子集上运行 KSP,或在目标之间共享计算。
- 提升性能。还有一大堆优化要做!
- 继续修复缺陷。
如果你想讨论任何想法,欢迎在 Kotlin Slack 的 #ksp 频道(获取邀请)中联系我们。也欢迎提交 GitHub 问题/特性请求或 pull request!